#ifndef DLLH
#define DLLHextern "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 工具 我们也可以看到函数名变掉了。
解决的办法 第一是def 来导出。 我试过了 成功了。虽然加了stdcall 修饰符号
但dll 里面的函数名还是 dee 这样的名字。但是这里有大侠说 def 是不好的。 而且我发现使用了def 无法导出全局变量。
所以 我想问应该怎么才能生成带__stdcall 修饰的导出函数? 这样别的程序也可以使用?(我的代码 如果不加__stdcall ,bcb 也可以调用的。 真不知道__stdcall 是否真的重要)
#define DLLHextern "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 工具 我们也可以看到函数名变掉了。
解决的办法 第一是def 来导出。 我试过了 成功了。虽然加了stdcall 修饰符号
但dll 里面的函数名还是 dee 这样的名字。但是这里有大侠说 def 是不好的。 而且我发现使用了def 无法导出全局变量。
所以 我想问应该怎么才能生成带__stdcall 修饰的导出函数? 这样别的程序也可以使用?(我的代码 如果不加__stdcall ,bcb 也可以调用的。 真不知道__stdcall 是否真的重要)
其实只要调用双方能够遵循一致的调用约定并注意字节对齐,__stdcall还是__cdecl问题都不大至于你说的全局变量问题, 你可以导出两个函数来Set跟Get嘛...
然后在其他语言里面照着引用就是了,至于是不是stdcall问题不大啊
至于为什么 VB不支持cdecl,还有一些其他语言不支持不使用def也可以的,似乎是通过增加编译指令。