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

时间:2014-01-24 11:19:58

标签: c++ c windows dll

我有一个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

1 个答案:

答案 0 :(得分:3)

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

有关为_stdcall_cdeclCalling convetion调用约定搜索的详细信息。