【问题标题】:Error with call of WinApi GetVersionExA function: Error A2114 INVOKE argument type mismatch : argument : 1调用 WinApi GetVersionExA 函数时出错:错误 A2114 INVOKE 参数类型不匹配:参数:1
【发布时间】:2020-09-27 18:07:01
【问题描述】:

我需要从masm 上编写的程序中调用GetVersionExA 函数。它接受LPOSVERSIONINFOA 类型的单个参数lpVersionInformation。我想LPOSVERSIONINFOA_OSVERSIONINFOA 结构的实例。 所以我写了这个简单的程序但得到了以下错误:

Error   A2114   INVOKE argument type mismatch : argument : 1 
                                                            main.asm    24

我不知道出了什么问题以及如何解决它。

.586
    .model flat, STDCALL
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\gdi32.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\Advapi32.inc
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\Advapi32.lib
    .data
    params OSVERSIONINFOA  <>
    buf db 100 dup(?),0
    titl1 db '№ 5 ', 0
    ifmt db "Info = %d %d %d %d %d %c",0dh,0ah,0ah,0
    .code
    Start:
    invoke GetVersionEx, params ; <================================ 24

    invoke wsprintf,ADDR buf,ADDR ifmt,params.dwOSVersionInfoSize,params.dwMajorVersion ,params.dwMinorVersion ,params.dwBuildNumber ,params.dwPlatformId ,params.szCSDVersion
    invoke MessageBox, NULL, ADDR buf, ADDR titl1, MB_OK
    invoke ExitProcess, 0 
    end Start

【问题讨论】:

标签: winapi assembly masm


【解决方案1】:

LPOSVERSIONINFOA 是一个指向OSVERSIONINFOA指针。因此,正如wsprintf() 将分配的char[] 数组的地址 写入以返回其输出字符串,GetVersionEx() 采用分配的@ 的地址 987654326@ 写入以返回其版本数据。

另外,您需要在调用GetVersonEx() 之前设置OSVERSIONINFOA.dwOSVersionInfoSize 字段,因此它知道您传递的是OSVERSIONINFOA 还是OSVERSIONINFOEXA 实例的地址(其中有不同的大小和字段)。

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多