【问题标题】:using callback from delphi dll with c++使用 c++ 中的 delphi dll 回调
【发布时间】:2016-09-01 20:08:32
【问题描述】:

我必须使用提供一些回调程序的 delphi dll。如果我将它们与 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);
}   

在 C++ 中我无法解决它:

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;
}

其他返回字符串的 dll 调用正在运行。尝试以各种方式使用函数指针或std::function/std::bind,但没有运气。

请有人检查我的 C++ 代码并给我一个提示!我已经没有任何想法了。

【问题讨论】:

  • 如果我使用 C++,回调不起作用。 -- 请更详细地解释您所说的“不起作用”是什么意思。程序崩溃?其他一些函数被调用?没有函数被调用?
  • 在 c++ 解决方案中,函数 showConnected() 永远不会被调用。在 C# 中它得到了。
  • 所以现在的问题是:Delphi 代码在做什么?该回调的值是多少? C++ 代码可能没有被调用,因为 Delphi 没有调用它。 if Assigned(connectedCallback) then——如果这个结果是false呢?
  • 我对delphi不熟悉。所以对我来说更好的问题是,是什么让 C# 代码与 C++ 代码如此不同?因为使用 C# 它可以工作。
  • C# != C++。这就是为什么你必须查看中间人,即 Delphi 代码,以了解它实际做了什么。

标签: c++ delphi dll callback function-pointers


【解决方案1】:

我通过使用 Visual Studion Win32 项目模板解决了这个问题,或者将 C++ 主函数修改为:

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

这使 dll 的进程保持活动状态。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多