Delphi EXE и DLL без сборки с пакетами времени выполнения - PullRequest
0 голосов
/ 21 октября 2010

Для моего последнего проекта я использовал много фреймов в своем приложении delphi, поэтому я решил создать dll и поместить их в dll (ВСЕ созданные в Delphi)

Я просмотрел множество веб-сайтов и нашел код, который работает, но для этого примера мне нужно скомпилировать и приложения, и библиотеки dll с сборкой с пакетами времени выполнения , что означает, что я должен также распространять bpls. и если не проверять сборку с пакетами времени выполнения, то приходит ошибка

это код, который я нашел

в exe

procedure TForm1.Button1Click(Sender: TObject);
type
TGetTheFrame =Function( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall ;
 var
  GetTheFrame : TGetTheFrame;
begin
try
   GetTheFrame(application,TabSheet1).Free ;
except
end;
frm := GetTheFrame(application,TabSheet1) ;
dllHandle := LoadLibrary('project1.dll') ;
   if dllHandle <> 0 then
   begin
     GetTheFrame := GetProcAddress(dllHandle, 'GetTheFrame') ;
  frm := GetTheFrame(application,TabSheet1)   //call the function
    {   ShowMessage('error function not found') ;
     FreeLibrary(dllHandle) ; }
   end
   else
   begin
     ShowMessage('xxxx.dll not found / not loaded') ;
   end

в dll

Function  GetTheFrame( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall;
Begin
 Result := TFrame2.Create( Owner );

 Result.Parent := TheParent;
End;

это все, но я хочу, чтобы этот код работал без пакетов времени выполнения

1 Ответ

7 голосов
/ 21 октября 2010

Жаль. Этот код не будет работать без пакетов времени выполнения. (И с пакетами времени выполнения, вы должны использовать LoadPackage вместо LoadLibrary.)

Без пакетов каждый модуль вашей программы (EXE и каждая DLL) имеет свою собственную копию определения всех стандартных классов, включая TFrame, TWinControl и даже TObject. * TWinControl класс из EXE-файла не похож на TWinControl для DLL.

Поскольку вы разделяете классы между модулями, вам необходимо убедиться, что все они имеют одинаковые определения этих классов, и как вы это делаете во время выполнения пакетов.

Если вы действительно не будете использовать пакеты времени выполнения, вам нужно изменить интерфейс вашей DLL, чтобы она не разделяла какие-либо типы объектов Delphi. Вместо родительского TWinControl передайте свойство Handle элемента управления или любое другое значение HWnd, которое будет использоваться в качестве родительского окна. Код DLL не сможет предположить, что для родительского объекта больше существует объект Delphi, а EXE не сможет предположить, что элемент управления, который он получает, является объектом Delphi; они будут ограничены использованием Windows API для управления дескрипторами окна и отправки сообщений.

...