4

DLL を外部関数として実際に使用しない限り、Delphi EXE に dll を埋め込むための About.com ガイドを実行しました。とにかく、uses 句で参照されているユニットよりも早く動作するようにリンクしたコードを取得する方法はありますか。
私はもう試した:

  • このコードが言うことを正確に実行します。
  • このコードを、外部関数を使用するユニットを使用するフォームの初期化セクションに配置します。
  • 外部関数を使用するユニットの初期化セクションにこのコードを配置します。

外部関数とは、次のような関数を指します。

function MyFunction: Integer; stdcall; external 'fundll.dll';

私が得ている問題は、通常の「fundll.dll」をロードできないことです(ディレクトリにないため)。Zarko のコードは、コードがそこまで到達すると機能します (非常に便利です。そのフォルダーに dll が作成されます)。しかし、必要な外部関数を使用しているときに、プロジェクトが開始される前にクラッシュするだけです。

4

3 に答える 3

6

外部関数でこれを行うことはできません.DLLを抽出した後、代わりにLoadLibrary()GetProcAddress()を使用すると、すべてが機能するはずです.

その理由は、すべてのエントリ ポイントが OS ローダーによって解決された後でのみ、コードが実行されるためです。鶏が先か卵が先かという問題のようなものです。

于 2009-04-29T16:19:39.837 に答える
4

LoadLibrary() と GetProcAddress() を使用する場合は、BTMemoryModule を使用することをお勧めします。これにより、埋め込まれた DLL をファイルシステムに保存せずにリソースとして使用できるようになります (ユーザーはこれを実行できない可能性があります)。マシンのセキュリティによって異なります)。

http://www.jasontpenny.com/blog/2009/05/01/using-dlls-stored-as-resources-in-delphi-programs/

于 2009-05-02T00:53:04.813 に答える
3

その中で関数を呼び出したい場合は、2 つの選択肢があります ...

1) リソース メソッドの代わりに exe/dll バンドラーを使用します。2) 外部スタイル宣言でライブラリにリンクしないでください。代わりに、LoadLibrary、GetProcAddress などを使用して、呼び出す必要のある関数を参照してください。

リソース メソッドと外部としての関数の宣言は混在しません。Windows は、コードを実行して dll を抽出する前に、exe をメモリ内の dll にリンクしようとします。

于 2009-04-29T16:21:20.457 に答える