2014-12-05 51 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