2011-10-26 14 views
3

私はいくつかの助けを求めていました。 私はこの情報を得ることができる場所がたくさんあることを知っています。しかし、とにかく、私はC++ BuilderプロジェクトにDelphi DLLを接続する際に問題があります。例えば、C++ BuilderでDelphi DLLを接続して使用する

を私のDelphi DLLは、次のようになります。

library f_dll; 

uses 
    SysUtils, 
    Classes, 
    Forms, 
    Windows; 

procedure HW(AForm : TForm); 
     begin 
       MessageBox(AForm.Handle, 'DLL message', 'you made it!',MB_OK); 
     end; 
exports 
     HW; 

{$R *.res} 

begin 

end. 

そして、これは私が内部のDLLと機能の接続方法である:私は、コンパイラから間違いメッセージを持っていない

//defining a function pointer type 
typedef void (*dll_func)(TForm* AForm); 

dll_func HLLWRLD = NULL; 

HMODULE hDLL = LoadLibrary("f_dll.dll"); 
if (!hDLL) ShowMessage("Unable to load the library!"); 

//getting adress of the function 
HLLWRD = (dll_func)GetProcAddress(hDLL, "_HW"); 

if (!pShowSum) ShowMessage("Unable to find the function"); 

HLLWRLD(Form1); 

FreeLibrary(hDLL); 

を、私だけ私のメッセージボックスは、dllが接続されていないと言ってください。私は、Debugフォルダのプロジェクトフォルダに自分のdllを置いています。しかし、ただの接続はありません。

私はあなたのお手伝いをお願いします。私の間違いは何ですか? DLLは、同じディレクトリにある場合

//defining a function pointer type 
typedef void (*dll_func)(TForm* AForm); 

dll_func HLLWRLD = NULL; 

HMODULE hDLL = LoadLibrary("f_dll.dll"); 
if (!hDLL) ShowMessage("Unable to load the library!"); 

//getting adress of the function 
HLLWRD = (dll_func)GetProcAddress(hDLL, "HW"); //HW instead _HW 

if (!HLLWRLD) ShowMessage("Unable to find the function"); //HLLWRLD instead pShowSum 

HLLWRLD(Form1); 

FreeLibrary(hDLL); 

答えて

3
  1. 編集:私はので、ここで、ミスとC++のコードを掲載しましたが、右1(これは、同様の問題を抱えている人のためである)であります実行可能ファイルとして検出されます。

  2. Delphi DLLによってエクスポートされた名前は_HWではなくHWです。
  3. 呼び出し規約が一致しない可能性があります。それはDelphiでの登録とC++でのcdeclです。私は100%確信していないことに注意してください。ここではC++ Builderはデフォルトでcdeclになっています。

さらに深刻な問題は、単にこのようなDLL境界を越えてTFormを渡すことができないことです。 DLL内のオブジェクトのメソッドを呼び出すと、ホストexeのコードではなくDLLのコードが呼び出されます。しかし、それはオブジェクトに属するコードなので、呼び出す必要があるのはexeのコードです。

ランタイムパッケージまたはインターフェイスに切り替える必要があります。

+0

David、答えに感謝します。私はもう一度チェックした:はい、間違いは、私は間違ったフォルダにDLLを置いたことだった。すべてが今働きます。そして、私は何かをチェックしました - あなたはTFormをdllと他のすべてのVCLコンポーネントに渡すことができます。 – an40us

+1

@userいいえ、そのような 'TForm'を渡すことはできません。 handleプロパティを読み込むだけの簡単なことが動作します。実際にはかなりうまくいくかもしれません。しかし、ロットは失敗します。 –

+0

大丈夫、ありがとう、あなたは私の多くの助け:) – an40us

関連する問題