2017-10-16 11 views
1

私は別のモジュール(プラグイン)で動作するようにアプリケーションを調整しています。function EXE to DLL(Delphi)

私は既にEXEアプリケーションでフォームを含むプラグインを読み込んで読み込みました。

私は、逆関数を実行し、実行可能ファイルからDLLに関数をエクスポートする必要があります。

例: 実行可能ファイルの中には、TMemoコンポーネントがあります。私は)機能GetMemoを(呼び出すときに、DLLプラグインを書いた人は誰でも、私の考えでは、この

function GetMemo(): widestring; 

のような関数を作成したい、すでにDLLにTMemoオブジェクトの内容を取るだろう。

可能でしょうか?

+0

アプリケーションの消費者は非常に多くの作業を行う必要があります。フォームをDLLに入れてください。 – Victoria

+0

確かにこれが可能です。実行可能ファイルは関数をエクスポートできます。プラグインにCOMインターフェイスを提供する方が良いかもしれません。小さな情報でデザインをガイドするのは難しいです。 –

+0

いずれかのデルファイのネイティブタイプを使用して、Delphi自体が書かれているように、またはMicrosoftのCOM標準に固執するが、それは外部のタイプ(インターフェイス)の定義のような余分なツールを習得する必要があります –

答えて

3

これを処理する最も簡単な方法は、関数ポインタのレコードを定義し、そのレコードのインスタンスを初期化しながら各プラグインに渡すようにすることです。 EXEは必要に応じて関数を実装し、DLLのようにPEエクスポートテーブルから実際にエクスポートすることなく、プラグインに渡すことができます。例えば

type 
    PPluginExeFunctions = ^PluginExeFunctions; 
    PluginExeFunctions = record 
    GetMemo: function: WideString; stdcall; 
    ... 
    end; 

function MyGetMemoFunc: WideString; stdcall; 
begin 
    Result := Form1.Memo1.Text; 
end; 

... 

var 
    ExeFuncs: PluginExeFunctions; 
    hPlugin: THandle; 
    InitFunc: procedure(ExeFuncs: PPluginExeFunctions); stdcall; 
begin 
    ExeFuncs.GetMemo := @MyGetMemoFunc; 
    ... 
    hPlugin := LoadLibrary('plugin.dll'); 
    @InitFunc := GetProcAddress(hPlugin, 'InitializePlugin'); 
    InitFunc(@ExeFuncs); 
    ... 
end; 

var 
    ExeFuncs: PluginExeFunctions; 

procedure InitializePlugin(pExeFuncs: PPluginExeFunctions); stdcall; 
begin 
    ExeFuncs := pExeFuncs^; 
end; 

procedure DoSomething; 
var 
    S: WideString; 
begin 
    S := ExeFuncs.GetMemo(); 
    ... 
end; 
+0

どうしたら、この件についてもっと詳しく? –

+0

ありがとうレミー・ルボー! –

+0

このブロック PPluginExeFunctions =^MyFunctions; "MyFunction"はGetMemoですか? –