一个动态调用dll 有关问题。 如何样生成带 _stdcall 的标准导出函数
一个动态调用dll 问题。 怎么样生成带 __stdcall 的标准导出函数
#ifndef DLLH
#define DLLH
extern "C " {
int _declspec(dllexport) dee(int a, int b);
int _declspec(dllexport) mmx(int a, int b);
}
#endif
#include "dll.h "
#include <stdio.h>
int dllGlobalVar = 100;
int dee(int a, int b) {
dllGlobalVar++;
printf( " dllGlobalVar =%d \n ", dllGlobalVar);
return a -b;
}
int mmx(int a, int b) {
return a*b;
}
生成一个dll
调用代码如下
//#include "E:\\source\\VC\\dll\\lib.h "
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef int( * lpdeeFun)(int, int); //宏定义函数指针类型
typedef int( * lpmmxFun)(int, int); //宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll;
lpdeeFun deeFun;
lpmmxFun mmxFun;
hDll = LoadLibrary( "E:\\source\\VC\\dll3\\Debug\\dll3.dll ");
if (hDll != NULL) {
//deeFun = (lpdeeFun)GetProcAddress(hDll, MAKEINTRESOURCE(1));
deeFun = (lpdeeFun)GetProcAddress(hDll, "dee ");
if (deeFun) {
printf( " dee %d \n ", deeFun(100, 5));
printf( " dee %d \n ", deeFun(100, 5));
printf( " dee %d \n ", deeFun(100, 5));
}
mmxFun = (lpmmxFun)GetProcAddress(hDll, "mmx ");
if (mmxFun) {
printf( " mmx %d \n ", mmxFun(100, 5));
}
FreeLibrary(hDll);
}
hDll = LoadLibrary( "E:\\source\\VC\\dll3\\Debug\\dll3.dll ");
if (hDll != NULL) {
//deeFun = (lpdeeFun)GetProcAddress(hDll, MAKEINTRESOURCE(1));
deeFun = (lpdeeFun)GetProcAddress(hDll, "dee ");
if (deeFun) {
printf( " dee %d \n ", deeFun(100, 5));
printf( " dee %d \n ", deeFun(100, 5));
printf( " dee %d \n ", deeFun(100, 5));
}
mmxFun = (lpmmxFun)GetProcAddress(hDll, "mmx ");
if (mmxFun) {
printf( " mmx %d \n ", mmxFun(100, 5));
}
FreeLibrary(hDll);
}
return 0;
}
在vc 里面运行正常的。
但是按照教程上面的说法 int _declspec(dllexport) dee(int a, int b); 是__cdecl的方法。如果希望其他的程序也能调用 就需要加上__stdcall
我一旦把方法申明成为
int _declspec(dllexport) __stdcall dee(int a, int b);
很不幸。
GetProcAddress 将找不到函数。 利用depend 工具 我们也可以看到函数名变掉了。
#ifndef DLLH
#define DLLH
extern "C " {
int _declspec(dllexport) dee(int a, int b);
int _declspec(dllexport) mmx(int a, int b);
}
#endif
#include "dll.h "
#include <stdio.h>
int dllGlobalVar = 100;
int dee(int a, int b) {
dllGlobalVar++;
printf( " dllGlobalVar =%d \n ", dllGlobalVar);
return a -b;
}
int mmx(int a, int b) {
return a*b;
}
生成一个dll
调用代码如下
//#include "E:\\source\\VC\\dll\\lib.h "
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef int( * lpdeeFun)(int, int); //宏定义函数指针类型
typedef int( * lpmmxFun)(int, int); //宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll;
lpdeeFun deeFun;
lpmmxFun mmxFun;
hDll = LoadLibrary( "E:\\source\\VC\\dll3\\Debug\\dll3.dll ");
if (hDll != NULL) {
//deeFun = (lpdeeFun)GetProcAddress(hDll, MAKEINTRESOURCE(1));
deeFun = (lpdeeFun)GetProcAddress(hDll, "dee ");
if (deeFun) {
printf( " dee %d \n ", deeFun(100, 5));
printf( " dee %d \n ", deeFun(100, 5));
printf( " dee %d \n ", deeFun(100, 5));
}
mmxFun = (lpmmxFun)GetProcAddress(hDll, "mmx ");
if (mmxFun) {
printf( " mmx %d \n ", mmxFun(100, 5));
}
FreeLibrary(hDll);
}
hDll = LoadLibrary( "E:\\source\\VC\\dll3\\Debug\\dll3.dll ");
if (hDll != NULL) {
//deeFun = (lpdeeFun)GetProcAddress(hDll, MAKEINTRESOURCE(1));
deeFun = (lpdeeFun)GetProcAddress(hDll, "dee ");
if (deeFun) {
printf( " dee %d \n ", deeFun(100, 5));
printf( " dee %d \n ", deeFun(100, 5));
printf( " dee %d \n ", deeFun(100, 5));
}
mmxFun = (lpmmxFun)GetProcAddress(hDll, "mmx ");
if (mmxFun) {
printf( " mmx %d \n ", mmxFun(100, 5));
}
FreeLibrary(hDll);
}
return 0;
}
在vc 里面运行正常的。
但是按照教程上面的说法 int _declspec(dllexport) dee(int a, int b); 是__cdecl的方法。如果希望其他的程序也能调用 就需要加上__stdcall
我一旦把方法申明成为
int _declspec(dllexport) __stdcall dee(int a, int b);
很不幸。
GetProcAddress 将找不到函数。 利用depend 工具 我们也可以看到函数名变掉了。