动态调用VS2005生成的dll时出错?该如何处理

动态调用VS2005生成的dll时出错?
1.创建dll的工程为dlltest

//dlltest.h
#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif

//dlltest.cpp
#include "stdafx.h"
#include"dllTest.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
  DWORD ul_reason_for_call,
  LPVOID lpReserved
)
{
  return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

//add_Fun.cpp
#include "stdafx.h"
#include"dlltest.h"
DLLTEST_API int add_Fun( int *a,
int *b)
{
return (*a+*b);
}
用viewdll2.0测试工具可以看到dll要导出的函数名

2.工程testdll,调用生成的dlltest.dll

先把dlltest.dll放在工程testdll的子目录debug下

//testdll.cpp
#include "stdafx.h"
#include<windows.h>
typedef int (*AddFun)(int *a,int *b);
int _tmain(int argc, _TCHAR* argv[])
{
 HINSTANCE hDLL; 
 hDLL=LoadLibrary(_T("dlltest.dll"));//单步调试,hDLL不是空指针
 if(hDLL!=NULL){
  AddFun addfun=(AddFun)GetProcAddress(hDLL,"add_Fun"); //单步调试,addfun为空指针???
  int a=3;
  int b=4;
  int c;
  if(addfun!=NULL){
  c=addfun(&a,&b);
  printf("%d",c);
  }
  }
 
  FreeLibrary(hDLL);//卸载MyDll.dll文件;
 return 0;
}

------解决方案--------------------
C++生成的DLL函数名不是应该不是add_Fun,你通过dumpbin查看一下它的真实名称(应该是add_Fun@4562154asf乱七八糟之类的.)

要想C++编写的DLL的函数名不被更改,创建一个.def文件,内容如下:

EXPORTS
add_Fun
------解决方案--------------------
要确定导出的函数名称和 GetProcAddress 的参数完全一致才行
------解决方案--------------------
这样肯定不行啊,c++编译连接后的函数名和现在不一样了,加了一些东西。有两种方法,一个是通过.def文件确切的规定导出的函数名,一种就是 你去.lib,或者dll中看看 这个导出的函数名在dll中是什么名字,然后再动态的查找这个函数名。
------解决方案--------------------
用def指定导出函数add_Fun,这样可以防止导出函数修饰名
------解决方案--------------------
#define DLLTEST_API extern "C" __declspec(dllexport)