函数名称与序号值 - 从 DLL 模块获取函数地址

问题描述 投票:0回答:1

我有一个 DLL (WinDll.dll),它导出一个名为“SampleFunction”的函数。该 DLL 与正在执行的应用程序位于同一文件夹中。现在,当我尝试按名称获取导出函数的地址时,它会给出错误

127
,但是,当我使用函数的序数值执行相同操作时,它工作得很好。任何想法如何以及为什么会发生这种情况?以下是加载并尝试使用导出函数的代码。我还附上了 IDA Proo 的一个剪辑,其中显示了 WindDll.dll 导出的函数。

#include <windows.h>
#include <stdio.h>

typedef int (WINAPI *ProcP)(HINSTANCE, HINSTANCE, LPSTR, int);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HINSTANCE hinstlib;
    LPSTR lpBuffer = (LPSTR)malloc(256*2);
    GetCurrentDirectory(256,lpBuffer);
    ProcP procAddress = NULL;

    strcat(lpBuffer,"\\WinDll.dll");
    hinstlib = LoadLibrary(TEXT(lpBuffer));

    if(hinstlib == NULL){
        MessageBox(NULL,lpBuffer, "Bull", MB_OK);
        exit(0);
    }
    else{
        procAddress = (ProcP)GetProcAddress(hinstlib,"SampleFunction");    // <-- Problem
        if(procAddress != NULL){
            PostMessage(NULL, WM_RBUTTONDOWN, MK_RBUTTON, 0);   
        }
        else{
            MessageBox(NULL, "Invalid ProcAddress", "Bull", MB_OK); 
        }
    }

    return 0;
}

IDA Snapshot Dumpbin Snapshot

c++ c windows dll
1个回答
3
投票

SampleFunction()
似乎是用
_stdcall
调用约定声明的。因此,您必须传递给
GetProcAddress()
的函数名称是
_SampleFunction@16
,如
dumpbin
命令所示。

有关调用约定的更多详细信息,请搜索“stdcall”、“cdecl”和“调用约定”。

© www.soinside.com 2019 - 2024. All rights reserved.