Pertanyaan Delphi - membuat DLL dengan ekspor yang diteruskan


Di C / C ++ dimungkinkan untuk membuat DLL di mana beberapa fungsi ekspor diteruskan ke beberapa DLL lainnya (tanpa menggunakan stub loader):

#pragma comment(linker, "/export:TestFunc=Real_Lib.dll.TestFunc")

Atau alternatif - menggunakan file .def:

EXPORTS
   TestFunc=c:/Real_Lib.dll.TestFunc

(melihat kekurangan parameter atau jenis kembali).

Misalnya - di DependencyWalker untuk kernel32.dll - Anda dapat melihat ini: KERNEL32.AddVectoredExceptionHandler => ntdll.AddVectoredExceptionHandler



Pertanyaan: - Dapatkah Anda mencapai hasil yang serupa untuk DLL di Delphi? (harus menggunakan CLI compiler is ok ..)

Pada dasarnya ide adalah menghasilkan wrapper DLL yang membebani hanya beberapa fungsi, dan meneruskan sisanya - tanpa harus membuat stub loader untuk semua fungsi yang diekspor (dengan parameter, jenis pengembalian, dll).



catatan: Saya tahu bahwa Anda benar-benar dapat mengosongkan parameter metode untuk fungsi yang diekspor yang merujuk ke impor = perbaikan besar..
Tetapi masih perlu menentukan jenis metode yang benar (prosedur / fungsi), jenis pengembalian (untuk fungsi) dan konvensi pemanggilan.


Contoh (TestProgram -> Forwarder -> Real_DLL):

File DLL nyata - hanya dll biasa Anda:

library Real_Lib;
function TestFunc(a, b: Integer): Integer; stdcall;
begin
  Result := a+b;
end;
exports TestFunc;
begin
end.

Forwarder DLL - "meneruskan" fungsi yang diekspor ke impor statis:

library Forwarder;
function TestFunc: Integer; stdcall; external 'Real_Lib.dll';
exports TestFunc;
begin
end.

= perhatikan itu parameter dapat dihapus dengan aman.
TAPI - masih perlu menentukan jenis fungsi kembali.

Program tes - menggunakan forwarder DLL:

program TestProgram;
{$APPTYPE CONSOLE}
function TestFunc(a, b: Integer): Integer; stdcall; external 'Forwarder.dll';
begin
  Writeln('Result: ', TestFunc(2, 7));
  Readln;
end.


= Ini mengumpulkan dan bekerja: Result: 9.
Meskipun DependencyWalker menampilkannya sebagai ekspor biasa yang hanya memanggil fungsi impor:

Dan menghasilkan opcode ini:

00403E82    .  E8 7DFFFFFF       CALL <JMP.&Forwarder.TestFunc>

00403E04    $- FF25 20614000     JMP DWORD PTR DS:[<&Forwarder.TestFunc>]   ;  Forwarde.TestFunc

00383810 F>- FF25 08613800       JMP DWORD PTR DS:[<&Real_Lib.TestFunc>]    ; Real_Lib.TestFunc


Jadi - apakah benar meneruskan beberapa C / C + + hanya sihir kompiler atau mungkin dalam Delphi juga?


5
2017-10-10 14:15


asal


Jawaban:


Delphi tidak dapat membuat eksekutabel semacam itu. Anda perlu melakukan beberapa pasca-pemrosesan jika Anda ingin membuat DLL seperti itu dari Delphi.


1
2017-10-10 19:28