Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用WinApi GetVersionExA函数时出错:错误A2114调用参数类型不匹配:参数:1_Winapi_Assembly_Masm - Fatal编程技术网

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

调用WinApi GetVersionExA函数时出错:错误A2114调用参数类型不匹配:参数:1,winapi,assembly,masm,Winapi,Assembly,Masm,我需要从masm上编写的程序中调用该函数。它接受类型为LPOSVERSIONINFOA的单个参数lpVersionInformation。其中,LPOSVERSIONINFOA是struct的实例。 因此,我编写了这个简单的程序,但出现以下错误: Error A2114 INVOKE argument type mismatch : argument : 1 main

我需要从
masm
上编写的程序中调用该函数。它接受类型为
LPOSVERSIONINFOA
的单个参数
lpVersionInformation
。其中,
LPOSVERSIONINFOA
是struct的实例。 因此,我编写了这个简单的程序,但出现以下错误:

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
.586
.平板模型,标准球
选项案例图:无
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
.数据
参数OSVersionInfo
buf db 100重复(?),0
标题1 db'№ 5 ', 0
ifmt db“信息=%d%d%d%d%d%c”,0dh,0ah,0ah,0
.代码
开始:

调用GetVersionEx,params
LPOSVersionInfo
是指向
OSVersionInfo
的指针。因此,正如
wsprintf()
获取要写入的已分配
char[]
数组的地址以返回其输出字符串一样,
GetVersionEx()
获取要写入的已分配
OSVERSIONINFOA
的地址以返回其版本数据


另外,在调用
GetVersonEx()
之前,您需要设置
OSVERSIONINFOA.dwOSVersionInfoSize
字段,以便它知道您是否正在向它传递
OSVERSIONINFOA
OSVERSIONINFOEXA
的实例地址(它们具有不同的大小和字段).

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


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

除了参数指针,在Windows 8.1之后的版本中可能会被更改或不可用。相反,除了参数指针外,还可以使用。在Windows 8.1之后的版本中可能会被更改或不可用。相反,使用。