举例:
.cpp
IME_API int WINAPI Multiplya(int factorA, int factorB)
{
Log(-1,_T("[test] %d * %d = %d"),factorA,factorB,factorA * factorB);
return factorA * factorB;
}
.h
IME_API int WINAPI Multiplya(int factorA, int factorB);
在EXPORTS模块下边添加导出函数名字:Multiplya
编译生成DLL加载:
typedef int (*Multiplya)(int factorA, int factorB);
int main()
{
Multiplya multiplya;
HMODULE handle = LoadLibrary(L"Test.dll");
if (handle)
{
multiplya = (Multiplya)GetProcAddress(handle,"Multiplya");
}
else
{
FreeLibrary(handle);
system("pause");
return 0;
}
if (multiplya != NULL)
{
cout <<multiplya(2,4);
}
if (handle)
{
FreeLibrary(handle);
}
}
日志确实打印了:
但是却没有返回结果,并且弹出异常:
提示信息是调用不匹配导致栈里边的ESP不正常,但是感觉没啥问题啊,输入是int,输出是int
搜索问题,一般的原因写的是数组越界,但是没有数组问题啊,找了许久,终于找到了原因:
仔细一看,DLL中声明有WINAPI ,但是调用的声明没有,导致出现返回时ESP不一致而异常,
这样改就没有问题了:
typedef int (WINAPI *Multiplya)(int factorA, int factorB);
这样,对于核心部分代码,非要用白盒去测试,这样是相对比较简便的方法了。