首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

dll导出函数与静态成员变量的奇怪现象,望前辈指点~解决方案

2012-04-14 
dll导出函数与静态成员变量的奇怪现象,望前辈指点~写了个regular dll,大致定义如下:class CField{...publi

dll导出函数与静态成员变量的奇怪现象,望前辈指点~
写了个regular dll,大致定义如下:
class CField  
{
...
public:
_declspec(dllexport) CField*GetParent();
_declspec(dllexport) CField*GetLeftField();
_declspec(dllexport) void Debug();
protected:
_declspec(dllexport) virtual voidInitVariable();
...
protected:
CField*pParent;
CField*pLeftNeighbor;
CField*pRightNeighbor;
CField*pFirstChild;
CField*pLastChild;

static const BYTE*pucData; //cpp文件中有定义
static intnDataLen; //cpp文件中有定义
...
};

dll成功编译,主程序A调用dll。

问题一:
  我直接把这个定义的h文件包含在主程序A中,_declspec(dllexport)声明没有改成_declspec(dllimport),为啥A程序使用正常?

问题二:
  对于指针变量如pParent等,既没有在dll中声明为_declspec(dllexport),也没有在A中声明为_declspec(dllimport),但也能正确使用?(不知道是不是还有其他类型变量也可以这样使用)

问题三:
  pucData与nDataLen为静态成员变量,但是在A无法直接使用,否则报nDataLen无法解析。但是如果在dll声明中给nDataLen加上_declspec(dllexport),在A声明中给nDataLen加上_declspec(dllimport)就可以了。静态变量与非静态变量有什么不同呢?

[解决办法]
1 看看A的导出表
2 C++规定 有声明就可以使用
3 见 2

导出的时候一般整体导出一个类。
[解决办法]
补充问题2的回复
如果连接的时候找不到对应的变量定义,那么就会报连接错误。如果你在dll中导出了,就可以连接通过。

热点排行