用C++编写dll并使用
来源:互联网 发布:淘宝怎么无需物流发货 编辑:程序博客网 时间:2024/04/29 01:13
首先,我们写一个小小的例子
1.首先在VS2008中建立一个解决方案,在解决方案中新建一个项目,选择win32项目,再选择DLL,空项目。就建立了一个空的DLL项目,在头文件文件夹和源文件文件夹中分别建立firstdll.h和firstdll.cpp两个文件,我们将在firstdll.h文件中声明dll对外提供的函数的声明和类的定义。代码如下:
/*----------firstdll.h--------------------------------------------------------*/
#ifndef FIRSTDLL_H
#define FIRSTDLL_H
#ifdef DLLEXPORT
#define DLLOPTION _declspec(dllexport) //表明标有此宏定义的函数和类是dll文件的导出函数和类,是dll文件的对外接口
#else
#define DLLOPTION _declspec(dllimport) //表明标有此宏定义的函数和类的定义在dll文件中
#endif
class DLLOPTION CTest{
public:
virtual void sayHello(); //如果要在运行时动态链接导出类的成员函数必须声明为 virtual
};
extern "C" DLLOPTION CTest* getCTestInstance();
#endif
/*-----------firstdll.cpp-----------------------*/ //为firstdll.h中的导出函数和导出类的成员函数提供具体实现
#include <iostream>
#define DLLEXPORT //定义了预处理器变量 DLLEXPORT
#include "firstdll.h"
using std::cout;
using std::endl;
void CTest::sayHello(){
cout << "Hello i come from dll"<<endl;
return;
}
CTest* getCTestInstance(){
return new CTest();
}
到此为止一个简单的dll文件所需要代码都有了,在项目上右键,选择生成,就会在解决方案的Debug文件夹下产生一个firstdll.dll动态链接库文件。
2.运行时动态链接的实现
首先,在同一个解决方案中建立一个新的win32项目。将firstdll.dll复制到项目文件夹下,再在IDE中将头文件添加项目中。编辑firstdll.dll文件将导出函数中要导出的成员函数改为virtual void sayHello()=0;(如果你是在加载时动态链接dll文件则不需要这么麻烦)
下面我们要编写运行时动态链接的代码了。我们在项目的源文件目录中建一个test.cpp文件。代码如下:
/*----------------test.cpp----------------------------------------------------------*/
#include <windows.h>
#include <iostream>
#include "firstdll.h" //注意在导入firstdll.h文件之前,没有在声明DLLEXPORT 预处理器变量
#pragma comment(linker, "/subsystem:console ")
//告诉连接器,程序运行的方式是 win32 console. /subsystem:console 是连接器选项
using std::cout;
using std::endl;
int main(){
LPWSTR lpws = L"firstdll.dll";
typedef CTest* (*dllProc)(); //定义一个函数指针类型,将来会用该类型的指针调用CTest* getCTestInstance()函数
HINSTANCE hdll = LoadLibrary(lpws); //winapi 参数是dll文件的变量名/全路径名+变量名 。返回dll文件的句柄
if(hdll != NULL){
//winapi 利用dll句柄和导出函数的函数名得到函数的入口地址。返回 void* 所以要强转
dllProc pdp = (dllProc)GetProcAddress(hdll,"getCTestInstance");
CTest* pCTest = (pdp)(); //执行导出函数 返回指向CTest类的指针
pCTest->sayHello(); //利用类指针执行导出类的成员函数
delete pCTest;
FreeLibrary(hdll); //望名生义 此winapi的作用是释放被动态链接到程序中的dll文件
cout << "the result of test is successful !!" <<endl;
}else{
cout << "Can not get handle of classdll.dll" << endl;
}
system("pause");
return 0;
}
第一次写的话难免出错比如创建项目是没有创建成win32 console application 而是 创建成 win32 application 可能会导致程序找不到入口所以显式的使用:#pragma comment(linker, "/subsystem:console ")
本人第一次写的时候还导致过访问冲突,结果是因为返回dll文件句柄的函数返回的是空。
发现程序不对了,可以调用GetLastError() api 返回错误的编号,然后在msdn中查找错误的原因。
如果调用不到dll文件中的导出函数,有可能是dll文件有问题。可以用"C:\Program Files\Microsoft Visual Studio\COMMON\Tools\DEPENDS.EXE"来查看dll文件的内容,这个
软件的使用方法我不是懂,我也就是看看那个函数在dll中到底有没有。
- 用C++编写dll并使用
- 用C++编写dll并使用
- C++编写DLL并使用C++调用
- 【原创】生成编写DLL并使用DLL文件
- C语言编写DLL动态链接库并分别用VB和Python调用
- 编程c++dll , DLL 的编写,导出函数 ,使用函数
- Visual C#(VS2008)制作DLL文件并使用DLL文件
- 使用emacs编写c程序并编译
- VFP编写DLL,并调用
- Qt 编写DLL 并调用
- Qt 编写DLL 并调用
- Qt 编写DLL 并调用
- Qt 编写DLL 并调用
- 如何使用C/C++为Python编写DLL/SO
- DLL 编写与使用
- DLL编写和使用
- 在VS2008环境下编写C语言DLL,并在C++和C#项目下调用
- 用VC创建并使用DLL
- 静态变量、静态方法说明
- Django 结构及处理流程分析
- BEA Weblogic 8.1 SP5 性能调优
- hdu1671 Phone List
- 用Shell 执行java 程序
- 用C++编写dll并使用
- 现在人太浮躁!
- 家里装空调了。
- python之zip
- 使用 .NET 实现 Ajax 长连接 (Part 2 - Mutex Wait & Signal)
- 移动短信的状态报告
- 转载《XAMPP安装和使用教程》
- EBMIDE——表单、报表模板设计
- C语言深度解剖【第一章问题】