DLL中定义了一个全局数组char abc[100];外部程序中如何引用它

解决方案 »

  1.   

    搞明白了,给大家看一下
    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)此时程序就完全可以跟之前一样正常工作了.