【问题标题】:How to deal: app does not see func from my dll如何处理:应用程序没有从我的 dll 中看到 func
【发布时间】:2020-03-07 09:22:33
【问题描述】:

创建了一个 dll 和一个应用程序来测试 dll 中的 proc。

程序计算一个字符的重复次数。

代码:

dll:

.586
.model flat, stdcall
option casemap: none 

include C:\masm32\include\windows.inc 
include C:\masm32\include\user32.inc 
include C:\masm32\include\msvcrt.inc

includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib 

.data
msg_string db 'Enter string: ', 0
msg_symbol db 'Enter symbol: ', 0
result db 'Count = %d', 0
str_modifier db '%s ', 0
sym_modifier db '%c', 0

.data
string db ?
symbol db ?

.code
DllEntry PROC hInstDLL:DWORD, reason:DWORD, reserved:DWORD  
    mov  eax, 1  
    ret 
DllEntry ENDP 

symbol_count PROC EXPORT 
    
    invoke crt_printf, OFFSET msg_string
    invoke crt_scanf, OFFSET str_modifier, OFFSET string
    invoke crt_printf, OFFSET msg_symbol
    invoke crt_scanf, OFFSET sym_modifier, OFFSET symbol
    
    xor esi, esi
    xor ecx, ecx

    mov ebx, OFFSET string
    mov al, symbol
loop1:
    cmp byte ptr [ebx + ecx], 0
    je endloop
    cmp al, byte ptr [ebx + ecx]
    jne next
    inc esi
next:
    inc ecx
    jmp loop1 
endloop:
    
    invoke crt_printf, OFFSET result, esi
    
    ret 

symbol_count ENDP 

End DllEntry

如果我有更好的编码方式,也请告诉我。在互联网上很难找到所需的信息。谢谢。

测试应用:

.586
.model flat, stdcall
option casemap: none 

include C:\masm32\include\windows.inc 
include C:\masm32\include\user32.inc 
include C:\masm32\include\msvcrt.inc

includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib 

LoadLibraryA proto LibName:DWORD
GetProcAddress proto hLib:DWORD, FunctionName:DWORD
FreeLibrary proto hLib:DWORD
ExitProcess proto uExitCode:DWORD

.data
LibName db 'Labor07.dll', 0
FunctionName db '_symbol_count@0', 0
DllNotFound db 'cannot find the dll', 0
AppName db 'Load explicit dll', 0
NotFound db 'Func is not found', 0
msg db 'Hello', 0
hLib dd ?
symbol_count_addr dd ?

.code
start:
    
    invoke LoadLibraryA, addr LibName
    .if eax == NULL
        invoke MessageBoxA, NULL, addr DllNotFound, addr AppName, MB_OK
    .else
        mov hLib, eax
        invoke GetProcAddress, hLib, addr FunctionName 
        .if eax == NULL
            invoke MessageBoxA, NULL, addr NotFound, addr AppName, MB_OK
        .else
            push offset msg 
            mov symbol_count_addr, eax 
            call [symbol_count_addr] 
        .endif
        invoke FreeLibrary, hLib 
    .endif 
    invoke ExitProcess, NULL 
end start

结果是 MessageBox:

更新 #1

结果:

%path%>Project4
Enter string: asfasf
Enter symbol: Count = 1
%path%>

更新 #2

%path%>project4
Enter string: asfasfasf
a
Enter symbol: Count = 4
%path%>

【问题讨论】:

    标签: visual-studio assembly dll masm dllimport


    【解决方案1】:

    labor07.dll 使用 STDCALL (.model flat, stdcall)。因此,函数的名称将被修饰:_symbol_count@0

    改变

    FunctionName db 'symbol_count', 0
    

    FunctionName db '_symbol_count@0', 0
    

    另外,必须导出函数symbol_count

    改变

    symbol_count PROC
    

    symbol_count PROC EXPORT
    

    【讨论】:

    • 谢谢,我猜程序从现在开始看到程序。但是由于某种原因,在启动程序后,它只是以代码 0 关闭。也许你知道为什么?我做错了什么?是 proc 坏了,还是 app...
    • @VolodimirPavlenko。该程序在这里工作,除了常见的 scanf 问题 ;-) 和错误计数。您的问题可能有很多原因。您是否将子系统设置为 CONSOLE?如果您提出新问题,请发布整个命令行(ml.exe 和 link.exe)。
    • 是的,我在使用 windows 子系统时出错了。我已经使用 Visual Studio 编译并链接了它,这就是为什么我不能发布命令行。请问我的scanf有什么问题吗?上传结果。
    • @VolodimirPavlenko:scanf 是魔鬼。第一个ENTER 在流中保留为LF(换行= 新行),并导致第二个scanf 立即中止。插入空格以清除空格(空格、制表符、新行):str_modifier db '%s ', 0。删除 mov ecx, eax 以进行正确计数。
    • 谢谢。现在它正在工作,但第二个 printf 感觉非常糟糕。你知道发生了什么事吗?上传新代码并更新 #2 - 新结果。
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2017-07-22
    相关资源
    最近更新 更多