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

Error with call of WinApi GetVersionExA function: Error A2114 INVOKE argument type mismatch : argument : 1

我需要调用 GetVersionExA function from the program written on masm. it accepts a single parameter lpVersionInformation of the type LPOSVERSIONINFOA. Where LPOSVERSIONINFOA as i suppose is the instance of _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

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

另外,你需要在调用GetVersonEx()之前设置OSVERSIONINFOA.dwOSVersionInfoSize字段,所以它知道你是否传递给它地址的一个实例OSVERSIONINFOAOSVERSIONINFOEXA(具有不同的大小和字段)。