c++ - AutoIt中调用DLL函数,DLLStruct没有数据

标签 c++ autoit cen-xfs

我是新来的,我会尽力解释。 我正在编写一些信息工具,需要返回一些与特定硬件 ATM 相关的数据,所以我有它的 API,它的文档完全混淆了 VB6 C++ 中的代码 所以我需要调用特定的 dll 函数,C++ 中的原始代码是这样的:

typedef struct _wfsversion
{
    WORD            wVersion;
    WORD            wLowVersion;
    WORD            wHighVersion;
    CHAR            szDescription[WFSDDESCRIPTION_LEN+1];
    CHAR            szSystemStatus[WFSDSYSSTATUS_LEN+1];
} WFSVERSION, * LPWFSVERSION;

//and  Function calls APi and expect some  response.

BOOL Wfs_StartUp(void)
{
    WFSVERSION WfsVersion;
    return (WFSStartUp(RECOGNISED_VERSIONS, &WfsVersion) == WFS_SUCCESS);

#define RECOGNISED_VERSIONS 0X00030203

在 AutoIt 中我做了以下事情:

#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <Array.au3>
Global Const  $hXFSDLL = DllOpen ( "C:\Coding\infotool\msxfs.dll")
Global Const $RECOGNISED_VERSIONS = "0X00030203"
Global Const $lpWFSVersion = "word wVersion;word wLowVersion;word wHighVersion;char szDescription[WFSDDESCRIPTION_LEN+1];char szSystemStatus[WFSSYSSTATUS_LEN+1]"
$structLPWFSVERSION = DllStructCreate($lpWFSVersion)
DllCall($hXFSDLL,"BOOL","WFSStartUp","dword",$RECOGNISED_VERSIONS, "struct", DllStructGetPtr($structLPWFSVERSION))
ConsoleWrite("wVersion = "&DllstructGetData($structLPWFSVERSION,"wVersion"))
ConsoleWrite(@CRLF)
ConsoleWrite("wLowVersion = "&DllstructGetData($structLPWFSVERSION,"wLowVersion"))
ConsoleWrite(@CRLF)
ConsoleWrite("wHighVersion = "&DllstructGetData($structLPWFSVERSION,"wHighVersion"))
ConsoleWrite(@CRLF)
ConsoleWrite("szDescription = "&DllstructGetData($structLPWFSVERSION,"szDescription"))
ConsoleWrite(@CRLF)
ConsoleWrite("szSystemStatus = "&DllstructGetData($structLPWFSVERSION,"szSystemStatus"))
ConsoleWrite(@CRLF)

作为响应,我没有得到任何数据:

wVersion = 0
wLowVersion = 0
wHighVersion = 0
szDescription = 0
szSystemStatus = 0

所以我想知道我做错了什么?

最佳答案

除了 mrt 评论的内容外,我认为您的功能描述有误。 WFSStartUp 想要struct pointer 而不是struct 所以类型应该是struct* 而不是struct.

Local $ret = DllCall($hXFSDLL, "LONG:cdecl", "WFSStartUp", "dword", $RECOGNISED_VERSIONS, "struct*", DllStructGetPtr($structLPWFSVERSION))

编辑:
我更改了上面的签名以反射(reflect) msxfs.dll 没有使用 stdcall 调用约定而是 cdecl 因为这是 DllCall 的 AutoIt 文档说一下调用约定:

By default, AutoIt uses the 'stdcall' calling method. To use the 'cdecl' method place ':cdecl' after the return type.

我引用的DllCall文档可以在这里找到:
https://www.autoitscript.com/autoit3/docs/functions/DllCall.htm

关于c++ - AutoIt中调用DLL函数,DLLStruct没有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27058800/

相关文章:

c++ - rapidjson pretty print 使用 JSON 字符串作为编写器的输入

firefox - 我希望 AutoIt 激活 Firefox 中的特定选项卡。如何才能做到这一点?

c++ - 指向结构体指针数组的指针

c++ - 初始化 : cannot convert from LPVOID error

c++ - 应用程序无法正确启动错误

C++按对象类型获取所有变量

c++ - 对具有 3 个通用参数的模板使用 std::enable if

c++ - 在 Windows 下使用 Eclipse CDT 和 Cygwin

regex - 从句子中选择一些字符串

AutoIt:激活并选择 ControlTreeView 中的元素上下文菜单