DLL中定义了一个全局数组char abc[100];外部程序中如何引用它
解决方案 »
- VC中有没有不是全局函数却相当于全局函数的
- 高分求~163邮箱自动登录代码,只实现登录部分即可,(VC++)
- QQ群:5574555[200人]刚清理40人出群.熟悉C++人进!
- 我怎样把EDIT控件中当前光标左边的苦干个字符取出来?
- CString保存为二进制文件问题
- 有没有支持类似PictureBox但是支持JPG图片的控件??
- 用啥涵数可以实现到记时功能?
- 创建CStatic CEdit后看不到啊,帮帮忙!
- 基于对话框的程序是如何进入消息循环的?对VC运作机制有研究的请进!!!
- 关于菜单(完全解决者,送100分)
- 一个有关粘贴板的问题,在线。
- 如何用vc将网站上的网页(html or xml )读入到一块内存中。
1.未使用DLL文件前的程序结构
SerialPort.h中定义的头文件如下:class CSerialPort
{
public:
CSerialPort();
~CSerialPort();
...
下面是一大堆成员函数
protected:
下面是一大堆成员函数和保护变量定义
};SerialPort.cpp中实现的类成员代码,其中我定义了几个全局变量和数组想传出去的
BYTE r_data[200];
int r_len, r_max_len;
BOOL r_exitflag;然后主程序创建一个对话框,来处理具体的应用.这个应用程序使用了类CSerialPort来做关于串口的多线程操作,程序已经调试正常了2.在CSerialPort调试稳定后,我想把它放到DLL库里去封装起来,同时尽量不改我原来的程序,那如何做呢?
下面是我的具体做法:
1)首先创建一个新的工程,用它来生成SerialPort.dll, SerialPort.lib
VC6下选择创建一个Win32 Dynamic-Link Library, 让它生成一个空的项目文件
然后把SerialPort.h, SerialPort.cpp加进项目中(Project->Add To Project选添加文件,就可以了)
2)修改SerialPort.h
在其中加一句话
#define DllClass __declspec(dllexport)
然后把
class CSerialPort
{
....
}
类定义改成
class DllClass CSerialPort
{
....
}3)修改SerialPort.cpp文件的全局变量,数组定义,改成这样
DllClass BYTE r_data[200];
DllClass int r_len, r_max_len;
DllClass BOOL r_exitflag;改完以后按F7,它就会生成SerialPort.dll和SerialPort.lib文件了,(当然项目文件名取成SerialPort它
生成的目标文件名才是这样的)使用Microsoft Visual Studio 6.0 Tools的工具Depends你就可以查看到生成的DLL文件中有哪些成员函数的样子了4. 应用程序如何使用SerialPort.dll
这一步是最关键的,就是现在我们的应用程序如何来使用SerialPort.dll并且可以引用它的外部变量和数组1)首先从你原来的项目文件中,删除SerialPort.cpp文件,你只需要把鼠标放置在这个文件上,按Delete键就可以删除掉它了
(注意,是从项目文件中删除,而不是真的把这个文件从磁盘中删除了,当然,为了感觉可靠,你可以真从磁盘中杀掉这个文件) 现在,程序的运行将不会与SerialPort.cpp有任何关系了
2)拷贝刚才生成的SerialPort.dll和SerialPort.lib两个文件到现在的项目文件目录下
在要用到SerialPort类的头文件中#include进来SerialPort类定义(注意这个类定义没做任何修改的)
在这个头文件中还要加一句话
#pragma comment( lib, "SerialPort.lib" ) 这句话需要加的,否则程序不知道去哪里找CSerialPort类的信息了3) 此时类就可以正常使用了,我们要用到其成员函数与之前是完全一样的,但要引用在DLL里的全局变量或数组时,你就得先做个这样的
申明:extern __declspec(dllimport) int r_len, r_max_len;
extern __declspec(dllimport) BYTE r_data[ ];
extern _declspec(dllimport) BOOL r_exitflag;4)此时程序就完全可以跟之前一样正常工作了.