2016-11-02 5 views
1

Ich versuche, ein Social Asynchronous Ereignis aus einer DLL unter Windows zu feuern. Es gibt ein Tutorial für diese here an der Unterseite.GameMaker Studio, Async-Ereignis von Windows DLL

Was ich nicht verstehe, ist die folgende

Wenn Ihre Erweiterung dieser Rückruf sollte sofort geladen wird Feuer und in Zeiger auf die vier Funktionen übergeben werden.

Ich denke, ich sollte die Funktion (RegisterCallbacks) von GML aufrufen, da der Rückruf als dllexport definiert ist.

Hier ist die Callback-Funktion

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

Aber wie soll ich einen Zeiger auf „CreateAsynEventWithDSMap“ von GML passieren? Wo bekomme ich diese Funktionen?

Antwort

1

Alte Frage, aber ich hatte dieses Problem kürzlich selbst und verbrachte ein paar Tage damit, mir den Kopf zu kratzen, also dachte ich mir, ich würde die Antwort für die Platte posten.

Zuerst muss die RegisterCallbacks Funktion in der DLL __declspec (dllexport) und auch extern "C" sein, wie jede andere Funktion, die zu GM exportiert wird.

Zweitens sollte die RegisterCallbacks-Funktion in GM auch nicht nur in der C/C++ - Datei definiert werden, sondern genau wie jede andere exportierte Funktion in der Erweiterung. Die vier Argumente sollten als String-Typ definiert werden. Es sollte so aussehen: http://i.imgur.com/pppbsWa.png

Jetzt sollte RegisterCallbacks automatisch ausgelöst werden, wenn Sie Ihr Spiel starten, und die DsMap-Funktionen, Async-Sachen zu tun, sollten funktionieren. Versuchen Sie nicht, RegisterCallbacks() manuell aufzurufen.

Verwandte Themen