调用WinApi GetVersionExA函数时出错:错误A2114 INVOKE参数类型不匹配:参数:1

问题描述

我需要从masm上编写的程序中调用GetVersionExA函数。它接受类型为lpVersionInformation的单个参数LPOSVERSIONINFOA。我想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,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 titl1,MB_OK
    invoke ExitProcess,0 
    end Start

解决方法

LPOSVERSIONINFOA是指向OSVERSIONINFOA指针。因此,就像wsprintf()获取分配的char[]数组的 address 并写入以返回其输出字符串一样,GetVersionEx()也采用了 address 分配的OSVERSIONINFOA的em>写入以返回其版本数据。

此外,您需要在调用OSVERSIONINFOA.dwOSVersionInfoSize之前设置GetVersonEx()字段,这样它才能知道是否向其传递OSVERSIONINFOA实例的 address OSVERSIONINFOEXA(具有不同的大小和字段)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...