2014-12-05 52 views
1

我想打電話叫從AutoIt的3(最新版本)的通用言語是C樣式庫。 這個問題是,我從我打電話的功能獲得所需的行動,但在我得到響應後,autoit崩潰,說autoit已停止工作,Windows可以搜索解決方案... 我做錯了什麼?調用C風格的DLL成功,然後AutoIt的崩潰

的AutoIt:

#notrayicon 
dllcall("UniversalSpeech.dll", "int", "speechSayA", "str", "test 123", "int", 1) 
sleep(1000) 

普遍speech.h:

#ifndef ____UNIVERSAL_SPEECH_H__ 
#define ____UNIVERSAL_SPEECH_H__ 
#if defined __WIN32 || defined __WIN64 
#define export __declspec(dllexport) 
#else 
#error Platform currently unsupported 
#endif 
#ifdef __cplusplus 
extern "C" { 
#endif 
int export speechSayA (const char* str, int interrupt) ; 
#ifdef __cplusplus 
} // extern "C" 
#endif 
#endif 

我已經成功地做到這在其他編程語言,但AutoIt的似乎並不喜歡它。

+0

請不要將「已解決」添加到問題中。你通過*回答*做了正確的事情(並且給定一段時間,你可以接受它)。 – usr2564301 2014-12-05 20:20:57

回答

2

正如我貼這個的不僅僅是這裏更多,對AutoIt的論壇用戶名「binhnx」一個人解決我的問題,我在這裏張貼這樣人就可以知道該怎麼做,如果他們抓住自己同樣的問題。

此庫使用cdecl調用約定,默認情況下使用自動調用約定stdcall調用約定。

CDECL是支持的,但你必須告訴您要輸入你旁邊正在調用該函數的返回類型:cdecl使用它的AutoIt:

所以在我的情況,而不是

dllcall("UniversalSpeech.dll", "int"...) 

你會是這樣的:

dllcall("UniversalSpeech.dll", "int:cdecl"...) 

解決了崩潰。

+1

「我認爲autoit開發者應該讓它自動地自動切換方法」它應該怎麼做?它沒有辦法找出哪一個是正確的... – glglgl 2014-12-05 19:34:21

+0

理論上可以通過保存堆棧指針並在從dll函數返回後比較它。 – Matt 2014-12-06 19:19:17