2016-09-01 5 views
-1

私はいくつかのコールバックプロシージャを提供するデルファイdllを使用する必要があります。私がC#でそれらを使用すれば、すべてが機能します。 C++を使用している場合、コールバックは機能しません。 C#を使用したときにすべての作品C++でdelphi dllからのコールバックを使用

procedure addConnectionCallBack(connectCallback: TConnectCallback); StdCall; 
begin 
    initMyConnection(); 
    if assigned(MyConnection) then 
    begin 
    MyConnection.addConnectionCallBack(connectCallback); 
    end; 
end; 

:Cで

// make delegate 
public delegate void ConnectionCallBack(); 

// define dll 
[DllImport(_dll_name, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
public static extern void addConnectionCallBack(ConnectionCallBack ccb); 

// function with signature of ConnectionCallBack 
private void showConnected() { 
    Console.WriteLine("connected"); 
} 

// address callback to dll 
public void start() { 
    addConnectionCallBack(showConnected); 
} 

++、私はそれを解決することはできません:へ

typedef void (__stdcall *ConnectionCallBack)(); 
typedef void (__stdcall *addConnectionCallBack)(ConnectionCallBack); 

addConnectionCallBack _addConnectionCallBack; 

// !!! this should be called from delphi dll, but isn't !!! 
void __stdcall showConnected() { 
    std::cout << "connected" << std::endl; 
} 
//auto showConnected = []()->void {std::cout << "connected" << std::endl; }; 

int main() 
{ 
    LPCWSTR _dll_name = L"MyDelphi.dll"; 
    HINSTANCE _hModule = NULL; 
    _hModule = LoadLibrary(_dll_name); 
    assert(_hModule != NULL); 

    _addConnectionCallBack = (addConnectionCallBack) GetProcAddress(_hModule, "addConnectionCallBack"); 

    ConnectionCallBack conn = showConnected; 
    _addConnectionCallBack(conn); 

    // do some other dll calls which work and force the callback. 

    FreeLibrary(_hModule); 
    return 0; 
} 

その他の呼び出しのように、Delphiで は、コールバックが書かれているdllを文字列を返すdllが動作しています。関数ポインタをさまざまな方法で試してみるか、std::function/std::bind運がありません。

私のC++コードをチェックして、ヒントを教えてください。もうアイデアはありません。

+1

*私がC++を使用している場合、コールバックは機能しません。* - 「動作しない」という意味を詳しく説明してください。プログラムがクラッシュしますか?他の関数が呼び出されますか?関数は呼び出されませんか? – PaulMcKenzie

+0

C++ソリューションでは、関数showConnected()は呼び出されません。 C#ではそれが得られます。 – solarisx

+0

それでは質問はこれです:Delphiコードは何をしていますか?そのコールバックの価値は何ですか? Delphiが呼び出していないため、C++コードが呼び出されていない可能性があります。 'assigned(connectedCallback)then'' - そして、もしこの結果が' false'ならば? – PaulMcKenzie

答えて

0

私は、Visual Studion Win32プロジェクトテンプレートを使用するかというにC++のメイン機能を・修正することで問題を解決:これは生きているDLLのプロセスを維持し

int CALLBACK WinMain(In HINSTANCE hInstance, In HINSTANCE hPrevInstance, In LPSTR lpCmdLine, In int nCmdShow) {}

ありがとうございました。

関連する問題