Utworzyłem sobie bibliotekę (.dll), która zawiera formularz z komponentem TGroupBox. Następnie tworze program, z którego chce uruchomić tą bibliotekę. Jeżeli program uruchamiający (główny) zawiera komponent TXPManifest to jest problem. Jeżeli uruchomię z programu głównego bibliotekę, później ją zamknę. To jest w porządku, ale jak chce następnie zamknąć program główny to wyskakuje błąd ACCESS VIOLATION. Jak wyrzuce XPManifest z głównego to jest dobrze. Co jest nie tak. Pomóżcie bo już głowa mi od tego pęka. [???] </b></i>
Po uruchomieniu programu TXPManifest dostosowuje wygląd komponentów na podobę XP - i czyni to wtedy gdy program uruchamiasz (podczas kreowania)
A że wywołujesz okienko z biblioteki, to kreowane jest po zakończeniu procedur zawartych w TXPmanifest - i w tym momencie gdzieś zachodzi błąd bo wygląd tego okna nie jest odświeżany.
S<ort>prubój</ort> tak: tam gdzie wywołujesz bibliotekę daj opcje TXPManifest na False i następnie na True - może to coś da ?
Albo wyłącz opcje zmiany wyglądu dla TGroupBox we właściwościach TXPManifest
Albo zamiast uzywać komponentu, zrób to.
Próbowałem rozwiązać ten problem poprzez dołączenie pliku nazwa_programu.exe.manifest, tak jak radził Qyon, ale to samo. Jeżeli uruchomię biblioteke, to przy wyjściu z programu głównego, znów wyskakuje błąd:
Instrukcja odwołuje się do pamięci pod jakimś adresem. Pamięć nie może być "read"
Jeśli chodzi o radę użytkownika Inter, to nie zabardzo wiem jak i którą zmienić opcje TXPManifest. Z właściwosci Published ma tylko "Tag" i "Name".
Pozdrawiam
możliwe że nie masz poprawki do Delphi odpowiedniej zainstalowanej. Miałem tak samo tyle że przy ListView. Wejdź na borland.com i poszukaj, tam gdzieś są poprawki do Delphi. One usuwają m.in. ten błąd.
Nakladki nie moge pobrac, bo nie mam zarejestrowanego Delphi. Przesylam kod zrodlowy biblioteki:
library Project1;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
ShareMem,
SysUtils,
Windows,
Forms,
Dialogs,
Classes,
DBTables,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
procedure UPkw;
begin
Form1:=TForm1.Create(Application);
Form1.ShowModal;
Form1.Free;
end;
exports UPkw name 'UPkw';
end.
Zalaczam kod formularza z biblioteki
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, Menus, ImgList, DBActns, ActnList, StdActns, StdCtrls,
ComCtrls,
Buttons, ExtCtrls, ToolWin;
type
TForm1 = class(TForm)
Button1: TButton;
GroupBox1: TGroupBox;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
Zalaczam rowniez kod programu wywolujacego biblioteke:
unit u2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, StdCtrls, UMyZBior, XPMan;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
XPManifest1: TXPManifest;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure UPkw; external 'DLL.dll' name 'UPkw';
procedure TForm1.Button1Click(Sender: TObject);
begin
UPkw;
end;
end.
Moze jest jakis blad w kodzie i dlatego nie chce XPManifest wspolpracowac z dllkiem. Prosze o pomoc [???]
// W przyszłości używaj tagów <code class="delphi"></code>
- Q