我正在尝试从Windows上的DLL触发社交异步事件。底部有一个针对此here的教程。

我不明白的是以下内容



我猜我应该从GML调用函数(RegisterCallbacks),因为回调被定义为dllexport。

这是回调函数

__declspec (dllexport) void RegisterCallbacks(char *arg1, char *arg2, char *arg3, char *arg4 )
{
    void (*CreateAsynEventWithDSMapPtr)(int,int) = (void (*)(int,int))(arg1);
    int(*CreateDsMapPtr)(int _num,...) = (int(*)(int _num,...)) (arg2);
    CreateAsynEventWithDSMap = CreateAsynEventWithDSMapPtr;
    CreateDsMap = CreateDsMapPtr;

    bool (*DsMapAddDoublePtr)(int _index,char *_pKey,double value)= (bool(*)(int,char*,double))(arg3);
    bool (*DsMapAddStringPtr)(int _index, char *_pKey, char *pVal)= (bool(*)(int,char*,char*))(arg4);

    DsMapAddDouble = DsMapAddDoublePtr;
    DsMapAddString = DsMapAddStringPtr;
}

但是,我应该如何从GML传递指向“CreateAsynEventWithDSMap”的指针?我从哪里获得这些功能?

最佳答案

这是个老问题,但最近我本人也遇到了这个问题,花了几天的时间挠头,所以我想我会记录下来的答案。

首先,DLL中的RegisterCallbacks函数需要为__declspec(dllexport),并且也必须为extern“C”,就像其他任何导出到GM的函数一样。

其次,RegisterCallbacks函数也应该在GM中定义,而不仅仅是在C / C++文件中定义,就像在扩展中的其他任何导出函数一样。四个参数应定义为字符串类型。它应该看起来像这样:http://i.imgur.com/pppbsWa.png

现在,当您开始游戏时,RegisterCallbacks应该会自动触发,并且做异步工作的DsMap函数应该可以工作。不要尝试手动调用RegisterCallbacks()。

10-08 03:56