Вызывая функцию DLL в AutoIt, DLLStruct не имеет данных

Я новичок здесь, и я постараюсь объяснить все возможное.
Я пишу некоторый инструмент Info, который должен возвращать некоторые данные о конкретном аппаратном обеспечении, связанном с 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

так интересно, что я делаю не так?

0

Решение

Кроме того, что прокомментировал mrt, я думаю, что ваше описание функции неверно.
WFSStartUp хочет указатель структуры не структура поэтому тип должен быть struct* не struct,

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

РЕДАКТИРОВАТЬ:
Я изменил вышеуказанную подпись, чтобы отразить тот факт, что msxfs.dll не использует соглашение о вызовах stdcall, но cdecl как это то, что AutoIt документация для DllCall сказать о соглашениях о вызовах:

По умолчанию AutoIt использует вызывающий метод ‘stdcall’. Чтобы использовать метод ‘cdecl’, поместите ‘: cdecl’ после возвращаемого типа.

DllCall документацию, которую я цитировал, можно найти здесь:
https://www.autoitscript.com/autoit3/docs/functions/DllCall.htm

1

Другие решения


По вопросам рекламы [email protected]