2014-11-21 2 views
0

저는 여기 새로 왔으며 최선을 다해 설명하려고 노력할 것입니다. 특정 하드웨어 ATM에 관련된 일부 데이터를 반환해야하는 정보 도구를 작성 중입니다. 따라서 해당 API가 있고 설명서가 VB6 코드로 완전히 혼동되고 있습니다. 그래서 특정 dll 함수를 호출해야합니다. 원래 코드는 C++입니다. 같은 : AutoIt을에서 AutoIt에서 DLL 함수를 호출하면 DLLStruct에 데이터가 없습니다.


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 
나는 다음을했다 :

#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) 

및 응답으로 나는 데이터 얻을 :

012,316을

그래서 내가 뭘 잘못하고 있는거야?

+0

WFSDDESCRIPTION_LEN 및 WFSSYSSTATUS_LEN의 값이에서 오는 않습니다 어디? 이 2 개의 상수를 적절한 정수 값으로 바꾸고 1을 더한 다음 임시 정수를 lpWFSVersion 문자열에 넣으십시오. – mrt

+0

정확히 그 오류, xfsapi.h에 명시된 바와 같이 256 + 1로 변경 :( –

답변

1

mrt의 코멘트 외에도 귀하의 기능 설명이 잘못되었다고 생각합니다. WFSStartUp구조체 포인터구조체이 아니므로 형식은 struct*이 아니고 struct이 아니어야합니다.

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

편집 :이 호출 규칙에 대해 말할 DllCall에 대한 문서를 AutoIt을 무엇으로 msxfs.dll는 stdcall을 사용하여 규칙하지만 cdecl를 호출 아니라는 사실을 반영하기 위해 위의 서명을 변경
:

기본적으로 AutoIt은 'stdcall'호출 메소드를 사용합니다. 'cdecl'메서드를 사용하려면 반환 형식 뒤에 ': cdecl'을 추가하십시오.

내가 인용 DllCall 문서는 여기에서 찾을 수 있습니다 :
https://www.autoitscript.com/autoit3/docs/functions/DllCall.htm

+0

함께 작동합니다 : 구조체 * 또는 ptr, 콘솔 쓰기 값을 문제는 이제 내가 반환 코드를 확인할 수 없습니다, 그것은 NULL입니다 ($ hXFSDLL, "BOOL", "WFSStartUp", "dword", $ RECOGNISED_VERSIONS, "struct", DllStructGetPtr ($ hXFSDLL, "$ hXFSDLL,"$ ret = ( WFS_SUCCESS (0) WFS_ERR_ALREADY_STARTED (-1) WFS_ERR_API_VER_TOO_HIGH : $ structLPWFSVERSION)) ConsoleWrite ("wVersion ="& DllstructGetData ($ structLPWFSVERSION는 "wVersion는")) ' 난 WFSstarup가 numbervalue 반환해야 WFSDESCRIPTION 및 WFSSYSSTATUS 값을 변경 -2) WFS_ERR_API_VER_TO O_LOW (-3) –

관련 문제