lm68140318 发表于 2024-2-8 10:21:54

GetModuleHandleA

.386
.model flat,stdcall
option casemap:none
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

.data   
szUserDll db 'User32.dll',0
hUserDllHandle DWORD ?


.code   
main PROC   
   
    invoke GetModuleHandleA,addr szUserDll
    .if eax
    mov hUserDllHandle,eax
    .endif


    INVOKE ExitProcess,0
main ENDP   
END main



我的问题:

invoke GetModuleHandleA,addr szUserDll   获取句柄,可是eax返回值是0   ?

FishC 发表于 2024-2-8 10:22:06

根据你提供的代码,可能有几个原因导致 eax 返回值为0。

1. szUserDll 字符串错误:请确保 szUserDll 字符串包含正确的 .dll 文件名。在你的代码中,szUserDll 设置为 "User32.dll",这是一个合法的库文件名。但是,如果实际上没有找到 "User32.dll" 文件,或者文件路径不正确,就会返回 0。请确保 "User32.dll" 文件在正确的位置,并且路径正确。

2. GetModuleHandleA 使用 ANSI 字符集:GetModuleHandleA 函数使用 ANSI 字符集,需要确保 szUserDll 字符串也是按照 ANSI 字符集进行编码的。如果在代码中使用了 Unicode 字符串或者其他字符集,可能会导致函数无法正确识别字符串而返回 0。请确保 szUserDll 字符串是 ANSI 格式的。

3. GetModuleHandleA 函数调用失败:GetModuleHandleA 函数也可能调用失败,这种情况下会返回 0。失败的原因可能是由于权限问题、操作系统不支持该函数或者其他未知问题。请确保代码运行在适用的操作系统上,并且有足够的权限执行该函数。

如果以上这些原因都不是导致 eax 返回值为0的原因,还可以尝试使用 GetLastError 函数来获取更多的错误信息。例如,在获取句柄之前,可以添加以下代码:

invoke GetLastError

然后查看 GetLastError 的返回值,可能会提供更多有关错误的详细信息。

尽管我无法确定具体的问题出现在哪里,但希望这些提示能够帮助你找到问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: GetModuleHandleA