1、打开VS2013,新建一个C++工程(不是MFC!),命名为 "mydll",接着选中 "DLL","导出符号",直接完成,如图:
2、这时,看到的是默认初奘疚豫枭始化好了的代码,我们把一些不必要的删掉(其实那些是用来参考的,实际编写时删掉也无大碍)。然后在“mydll.h”头文件里添加 下列代码:extern "C媪青怍牙" MYDLL_API int GetMaxNumber(int, int);extern "C" MYDLL_API void ShowMsg(char *, char*);在“mydll.cpp”源文件添加 如下图所示的功能实现代码:
3、OK!现在代码简简单单的写完了,那如何编译成 .dll 文件呢?单击菜单栏 >"生成">"生成 mydll",编译成功。(注意,不是调试下的开始执行...)然后找到工程的目录所在路径,DeBug目录下找到 那个生成的 “mydll.dll”(现在是不是很激动呢?!O(∩_∩)O)接下来还有更重要的事情呢!
4、在重新修建一个工程,这次是一个C++下的控制台应用程序来测试编写的dll是否成功运行!!工程名为“test_mydll”
5、添加一个.cpp源文件,添加如下代码:(注意,要把 my蟠校盯昂dll.dll 放到 生成的.exe 同一目录下)垆杪屑丝#include <windows.h>全局...typedef int( *pGetMaxN)(int, int); //定义一个函数指针类型typedef void( *pShowMsg)(char *, char *);main()...//动态加载 dll HMODULE hModule = LoadLibrary(L"mydll.dll"); if (!hModule) { cout << "Error!" << endl; } //获取函数 GetMaxNumber 的地址 pGetMaxN pgetm = (pGetMaxN)GetProcAddress(hModule, "GetMaxNumber"); cout << pgetm(10, 5) << endl; //获取函数 ShowMsg 的地址 pShowMsg pshowm = (pShowMsg)GetProcAddress(hModule, "ShowMsg"); pshowm("内容", "标题"); //释放 FreeLibrary(hModule);测试成功!!是不是很激动呢?!
6、这里要提醒一下哦,上面的是动态加载dll的,所以,就也是说,我们一直都没有使用原来的dll工程生成了那个“mydll.lib”的文件!那么现在以静态调用dll 也是可行的,但 要把那个.lib文件和 .h头文件放到 与.cpp 同一个目录下(注意,这个不是.dll文件,所以可以放在 与.cpp同一个目录下!!!!)
7、然后,可以放心的吧以前动态调用的代码注释掉啦,添加新代码,看图吧运行成功!
8、恩~~没错,编写dll到此大概基本上完成了,但是,一个动态链接库要在其他平台上也要能调用才算成功吧?!所以,我在这里就用易语言测试下能不能成功的调用.....(⊙o⊙)…一经测试,结果惨不忍睹,what?这究竟是为什么???为什么还会出现这个错误?这里我就不多说了...
9、既然这样,那就得找到解决的办法!我用depends载入那个dll看了下,函数格式正常。那问题又出现在哪,最后我在原来的dll工程里添加了一个.def文件!于是把连个函数导出去!再次编译!!(如果仔细观察的小伙伴会发现,我在 头文件和源文件 多添加了个 _stdcall 这是调用约定,详细须百度...)
10、于是我再一次把 mydll.dll 放到和易语言源文件一个目录下,再次运行!现在,终于成功了!既然这样,在C++下还能调用成功吗?结果是可以的。只是要稍微修改一下,也要加 _stdcall:(要注意我写的注释,不要混淆了)// 动态typedef int( _stdcall *pGetMaxN)(int, int); //定义一个函数指针类型typedef void( _stdcall *pShowMsg)(char *, char *);// 静态extern "C" __declspec(dllimport) int _stdcall GetMaxNumber(int, int);extern "C" __declspec(dllimport) void _stdcall ShowMsg(char *, char*);这样运行效果也是一样成功的!
11、总之,如果编写的dll文件中函数有 "_stdcall ",就必须把这个函数 添加到 .def 导出文件中!!!要注意 那个.def 函数导出文件的强大!!好了,至此结束了