#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 是否真的重要)

解决方案 »

  1.   

    DEF文件就是为解决跨语言平台调用dll而使用的, 所以你的问题实际上你自己已经回答了...
    其实只要调用双方能够遵循一致的调用约定并注意字节对齐,__stdcall还是__cdecl问题都不大至于你说的全局变量问题, 你可以导出两个函数来Set跟Get嘛...
      

  2.   

    你可以用 depends查看导出的函数名
    然后在其他语言里面照着引用就是了,至于是不是stdcall问题不大啊
      

  3.   

    使用def文件 调用方式使用stdcall 还需要extern "C" 因为C++会更改函数名字以适应重载。就可以了
    至于为什么  VB不支持cdecl,还有一些其他语言不支持不使用def也可以的,似乎是通过增加编译指令。
      

  4.   

    恩 我也同意的, 只是我比较希望有个完美的办法解决def 很麻烦,写一个函数 def 一个忘记了不太好
      

  5.   

    头文件中,extern "C"前面是不是加上 #ifdef __cplusplus 要好些,呵呵,新手,只是体格建议