0

dllで次のインターフェイスを定義しています。

class TestInterface
{
   public: int foo(int)=0;
};

そして、次の関数でこのタイプのオブジェクトを作成しましょう。

extern "C" declspec(dllexport) TestInterface* __stdcall CreateInterface();

インターフェイスはdllに実装されており、C ++で問題なく使用できます(.defすべてが正しく機能することを確認するためにファイルも定義しました)。ただし、パスカルでの使用に関しては問題があります。
これが私Interfaceがパスカルで使用しようとしている方法です:

type
  myinterface = interface(IInterface)
    function foo(param1: Integer): Integer;
  end;

TMyInterface = ^myinterface;
pCreateInterface = function: TMyInterface; stdcall;

var
  CreateInterface: pCreateInterface;

パスカルでのインターフェースの使用:

function init()
begin
  DllHandle := LoadLibrary(DLLPath);
  if DllHandle <> 0 then
  begin
    @CreateInterface := GetProcAddress(DllHandle, 'CreateInterface');
    if (@GetXYZ <> nil) then
    begin
      dllInitialized := true;
      myXYZ := CreateInterface();
      myXYZ.foo(1); // Access violation error here
    end;
  end;
end;

すべてが良いようです。デバッグ時には、CreateInterface正常に実行され、に値がありますmyXYZ。しかし、電話をかけようとするとfoo、アクセス違反エラーが発生します。
dllからクラス内にない関数を呼び出すことができるが、クラス/インターフェイス内にある関数は呼び出せないことに気づきました。
私は何か間違ったことをしていますか?これどうやってするの?
C++ソースを変更せずにdelphiでC++dllを使用する方法はありますか?

4

1 に答える 1

4

まず、DelphiコードにはIInterfaceから派生したオブジェクトがありますが、C++にはありません。

しかし、Rudy Velthuisによるこの記事を読むことをお勧めします:-

http://rvelthuis.de/articles/articles-cppobjs.html

基本的に、C ++エンドをCOMオブジェクトとして実装するか、C++オブジェクトをC呼び出し可能関数に「フラット化」する必要があります。

于 2013-02-06T14:46:32.037 に答える