[windows]使用 VC6.0 生成& 调用 DLL
2016-04-26 18:12
411 查看
1.使用 VC6.0 生成 DLL
新建项目 “Win32 Dynamic-Link Library”,输入项目名称,确定后选择 “A simple DLL project” 点击“完成”。 以下为cpp文件自动生成的代码:#include "stdafx.h"BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ return TRUE;} 编辑cpp文件:在#include "stdafx.h"的下一行加入extern "C" __declspec(dllexport) int fun(int a, int b); /*这是C格式导出函数;这种写法一般用在C++写的DLL中,指按C的规则导出这个函数,否则导出的函数会很怪;加上 extern "C" 表示按标准C格式导出函数.如果去掉仅兼容C++;其中 int fun(int a, int b) 这部分代码是我们想用 dll 实现的函数原型声明如果还想加入其他的可以继续加入 extern "C" __declspec(dllexport) int fun1(int a, int b);*/ DllMain 是 DLL 的默认入口函数,类似于C语言的main函数,该例子无需修改此处,在 DllMain 的后面加入:int fun(int a,int b){return a+b;} 这就是我们想用 DLL 实现的函数的定义,build 之后就会在 debug 目录下生成我们想要的 dll 文件
2.调用 DLL
新建一个 Win32 Console Application 工程,把刚才生成的 dll 文件拷贝到工程的根目录下 在 stdafx.h 文件中加入:#include <windows.h> 编辑cpp文件:#include "stdafx.h"typedef int (*PFUN)(int,int);void main(){ HMODULE hModule = ::LoadLibrary("dlltest.dll"); PFUN newfun = (PFUN)::GetProcAddress(hModule,"fun"); int i = newfun(1,2); printf("The result is %d\n",i); ::FreeLibrary(hModule);} 然后,运行就可以看到结果了 转 VC6.0下调用Dll文件提供的函数接口和全局变量函数接口:
首先把生成的Dll文件(如RegularDll.dll和RegularDll.lib)拷贝到当前工程所在文件夹,调用有两种方法:1)动态方法:使用LoadLibrary和GetProcAddress等函数,例
typedef void (*lpFun)(void);
HINSTANCE hDll;
hDll = LoadLibrary("RegularDll.dll");
if (NULL==hDll) {
MessageBox("Dll load failed!");
}
lpFun pShowDlg = (lpFun)GetProcAddress(hDll,"ShowDlg");
if (NULL == pShowDlg) {
MessageBox("Load function \"ShowDlg\" failed!");
}
pShowDlg();*/
2)静态声明方法:
创建Dll的工程中,函数声明和定义时用 _stdcall 修饰,例
void _stdcall ShowDlg(void){...}
在调用dll的工程的文件中,在文件头部声明库和函数,如下例
#pragma comment(lib,"RegularDll.lib")
void _stdcall ShowDlg(void);
调用时直接ShowDlg()就可以了。
以上两种方法在VC6.0中调试成功,保证可用!
有的文章中说这样声明即可:#pragma comment(lib,"RegularDll.lib")
void ShowDlg(void);
但在VC6.0下会报找不到函数ShowDlg的错误,不知是不是我没有设置好?
全局变量(访问Dll文件中的全局变量)
在创建Dll的工程中,在头文件中这样声明://lib.h#ifndef _LIB_H#define _LIB_H#ifdef DLL_FILE
extern int dllGlobalVar;
#else
extern int _declspec(dllimport) dllGlobalVar;
#endif
在创建Dll的工程的cpp文件中先定义DLL_FILE,再定义该变量,如下例://lib.cpp#define DLL_FILE#include "lib.h"
int dllGlobalVar; //defineBOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
dllGlobalVar = 100; // initialization when dll attached
break;……}int _stdcall GetGlobalVar()
{
return dllGlobalVar; // use the global variable
}
在调用Dll文件的工程中,需要访问该全局变量时,声明如下:#include "..\\lib.h"
#pragma comment(lib,"dllTest.lib")然后可以当作普通的全局值变量使用和修改了!printf("%d \n", dllGlobalVar);dllGlobalVar = 234;printf("%d \n", dllGlobalVar);修改会影响本工程使用的值,不过内部实现的原理还不清楚:(
相关文章推荐
- [ios]CGContext 函数说明
- [ios]presentModalViewController和dismissModalViewControllerAnimated汇总
- [activeX]使用ATL开发ActiveX控件[转]
- [activeX]VC2005开发MFC ActiveX ocx控件全过程[转]
- Mysql索引与优化
- 利用SecureCRT上传、下载文件(使用sz与rz命令)
- 分数化小数(指定精度)
- Android meta-data
- [ActiveX]C++的ActiveX网页控件开发[转]
- [原创]Choose a destination with a supported architecture in order to run on this device.
- iOS-正则表达式的使用
- Android---多级树形菜单的实现
- android--TextView[转]
- android--调用系统相机,显示图片
- 获取Android手机或Pad的屏幕的物理尺寸
- java--数据类型相互转换
- android--Activity跳转传值
- 在一个每一行从左到右递增每一列从上到下递增的二维数组中查找一个整数是否存在――3
- android--设置界面以及数据持久化
- android-- 获取路径目录方法以及判断目录是否存在,创建目录