问题描述
我需要从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
(具有不同的大小和字段)。