调用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之后的版本中可能会被更改或不可用。相反,使用。