GameMaker Studio,从Windows DLL创建异步事件

GameMaker Studio, Create Async Event from Windows DLL

本文关键字:创建 异步 事件 DLL Windows Studio GameMaker      更新时间:2023-10-16

我正试图从Windows上的DLL中触发社交异步事件有一个教程在这里在底部。

我不明白的是下面的

当你的扩展被加载时,这个回调应该立即触发并将指针传递给这四个函数

我想我应该从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的任何其他函数一样。

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

现在,RegisterCallbacks应该在你启动游戏时自动触发,并且DsMap函数应该可以执行异步操作。不要尝试手动调用RegisterCallbacks()