私はいくつかのコールバックプロシージャを提供するデルファイ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++コードをチェックして、ヒントを教えてください。もうアイデアはありません。
*私がC++を使用している場合、コールバックは機能しません。* - 「動作しない」という意味を詳しく説明してください。プログラムがクラッシュしますか?他の関数が呼び出されますか?関数は呼び出されませんか? – PaulMcKenzie
C++ソリューションでは、関数showConnected()は呼び出されません。 C#ではそれが得られます。 – solarisx
それでは質問はこれです:Delphiコードは何をしていますか?そのコールバックの価値は何ですか? Delphiが呼び出していないため、C++コードが呼び出されていない可能性があります。 'assigned(connectedCallback)then'' - そして、もしこの結果が' false'ならば? – PaulMcKenzie