一个古怪的问题

gigix 2002-03-13 05:26:40
下面是一个DLL完整的代码:
// a.h
#ifdef EXPORTS

#define SDKAPI __declspec(dllexport)

#else

#define SDKAPI __declspec(dllimport)
#pragma comment(lib, "Test00Dll.lib")

#endif

SDKAPI void A(map<string,string,less<string> > *b);

//a.cpp
#include <map>
#include <string>
using namespace std;

#include "a.h"

SDKAPI void A(map<string,string,less<string> > *b)
{
b->insert(map<string,string,less<string> >::value_type("4","s"));
}

EXE的代码如下:
#include <string>
#include <map>
using namespace std;

#if defined (ERROR)
#include "a.h"
#endif

#if defined (RIGHT)
void A(map<string,string,less<string> > *b)
{
b->insert(map<string,string,less<string> >::value_type("4","s"));
}
#endif

void main(){
map<string, string,less<string> > a;
A(&a);
}

请各位看看,把代码拷回去试验一下。我和恶魔都遇到了奇怪的问题。
编译环境:VC 6,不连接MFC
...全文
33 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gigix 2002-03-14
  • 打赏
  • 举报
回复
讲得太好了!多谢!
neccui 2002-03-14
  • 打赏
  • 举报
回复
本质上这是DLL的机制所造成的,普通的全局变量会出现多份不同的拷贝。

所以BCB应该也是一样的。
windindance 2002-03-14
  • 打赏
  • 举报
回复
OK
学习中

请问在BCB中会有这个错误吗
我在BCB中编译不通过
neccui 2002-03-14
  • 打赏
  • 举报
回复
呵呵,我既然知道你出了什么错误。

自然是把你的程序运行了一下的:P

总之原则就是如果DLL和EXE之间除了函数的关系之外,数据的关系也值得注意。STL内部实现很不确定,这种直接传递指针的方式是非常危险的。优化的一点点差别都会引发问题。

记住一个简单的原则,谁定义变量,谁使用。就不会出问题了。

neccui 2002-03-14
  • 打赏
  • 举报
回复
比如这样一个类:

class A
{
static int _i;
};

对于_i,可以认为是一个类外单独的定义:
int class_A__i; // _i的等效定义
意思就是它和全局变量是一样性质。
我们知道如果是全局变量的话,想在DLL和EXE同时使用,必须也export出来。


也就是说,如果class本身没有被export的话,这个 static int A::_i,在EXE里有一份,在DLL有一份,他们两个不相干。

但是,在操作同一个A对象的时候,DLL和EXE会分别去存取自己的那一份static int A::_i(冲突了)。这就会产生不能预期的效果。

neccui 2002-03-14
  • 打赏
  • 举报
回复
比如这样一个类:

class A
{
static int _i;
};

对于_i,可以认为是一个类外单独的定义:
int class_A__i; // _i的等效定义
也就是说它和全局变量是一样性质。
我们知道如果是全局变量的话,想在DLL和EXE同时使用,必须也export出来。


也就是说,如果class本身没有被export的话,这个 static int A::_i,在EXE里有一份,在DLL有一份,他们两个不相干。

但是,在操作同一个A对象的时候,DLL和EXE会分别去存取自己的那一份static int A::_i(冲突了)。这就会产生不能预期的效果。





gigix 2002-03-14
  • 打赏
  • 举报
回复
neccui(PPC):
我刚才已经把相关的文件发到你的信箱里面去了,请你收一下,帮我们看看。麻烦你了!
gigix 2002-03-14
  • 打赏
  • 举报
回复
对对!就是neccui(PPC)所说的问题。

我和恶魔研究了半天,发现就是一些变量的地址变化了。但是我们感觉:DLL和EXE应该是在同一条进程里面,不应该有这样的变化。请问你能不能再详细说明这个问题?

太高兴罗……终于遇到高手罗!
neccui 2002-03-13
  • 打赏
  • 举报
回复
这是VC的笨蛋错误。

在某些STL类模板内部存在static变量,这些变量在EXE和DLL中的值(特别是地址)完全不同。

你将EXE里声明的类拿到DLL里面去使,当然就出错误了。
chenhanrui 2002-03-13
  • 打赏
  • 举报
回复
错了,头文件我刚才没看到
但是什么古怪问题啊,也不说明一下
chenhanrui 2002-03-13
  • 打赏
  • 举报
回复
你的a.h头文件呢,大哥
windindance 2002-03-13
  • 打赏
  • 举报
回复
Test00Dll.lib
是什么?:)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧