stl, lib, dll, LoadLibrary fail.....

ed9er 2002-01-07 04:47:25
在lib中定义list,在dll初始化过程中操作它,load失败,why?

// lib.cpp

#include <list>
std::list<char *> s_list;

// eof lib.cpp


// dll.cpp

#include <list>

#pragma comment(lib, "../lib/debug/lib.lib")

extern std::list<char *> s_list;
char *str = "djfaskljf";

class Object {
public:
Object();
~Object();
};

Object::Object() {
s_list.push_front(str);
}

Object::~Object() {
s_list.remove(str);
}

Object instance;

// eof dll.cpp

// exe.cpp
#include <windows.h>
#include <stdio.h>

int main () {

printf("%x\r\n", LoadLibrary("../../dll/debug/dll.dll"));

return 0;
}

// eof exe.cpp


全部三个project的C/C++运行库都是Multi threaded DLL,还有heap的问题么?
如果把pragma那句去掉,把extern去掉,也就是在dll中定义list,则正常
vc的bug?我是6+sp5,迷茫。。。




...全文
159 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ed9er 2002-01-14
  • 打赏
  • 举报
回复
csdn里的半瓶醋是层出不穷继往开来




caowk 2002-01-14
  • 打赏
  • 举报
回复
小子,去死吧
qiyao 2002-01-11
  • 打赏
  • 举报
回复
有那位高手,可以搞定这个!!!
http://www.csdn.net/Expert/topic/470/470143.shtm
caowk 2002-01-11
  • 打赏
  • 举报
回复
不给分,嗯,我记下你的名字了。
caowk 2002-01-09
  • 打赏
  • 举报
回复
怎么不给分呢?
caowk 2002-01-08
  • 打赏
  • 举报
回复
我说的是正确的,好好考虑。我至少发现了VC++的5个类似Bug.你的问题就好像“一个动态库分配内存,另外一个动态库释放该内存”一样不出问题才怪呢。这同Multi threaded DLL没有任何关系。
北极猩猩 2002-01-07
  • 打赏
  • 举报
回复
Multi threaded DLL
就是因为他了,STL没有考虑到多线程的问题,所以在多线程环境下会出现很多问题.
ed9er 2002-01-07
  • 打赏
  • 举报
回复
我看不出楼上的说的东西和我的问题有什么联系

谢谢帮我顶,高手呢,都到哪去拉?以前我记得很多人说STL用在DLL里会有各种各样问题,谁能帮我解释下啊。。。。
caowk 2002-01-07
  • 打赏
  • 举报
回复
In fact, SLL, DLL and EXE are the same thing on certain extent. VC++ save some global variants into object file, but these global variants aren't exported.

For instance---->
DLL1.cpp:
int val = 10;
int getval(){return val;}//export
void setval(int v){val = v;}//export
Dll2.cpp
int val = 10;
int getval(){return val;}//export
void setval(int v){val = v;}//export
Exe.cpp
typedef int (*GetVal)();
typedef void (*SetVal)(int v);
void main()
{
HMODULE Lib1 = GetLibrary("Dll1.dll"), Lib2 = GetLibrary("Dll2.dll");
GetVal getval = (GetVal)GetProcAddress(Lib1, "getval");
SetVal setval = (GetVal)GetProcAddress(Lib2, "getval");
setval(100);
int val = getval();
printf("%d", val);//Now, you are sure the val is 10, but not 100.
//....
}

Are you okay?

The MS-STL isn't standard,they include some global variants which both you and I don't know, of course, you maybe have a look in their source codes.

If you test it in BCB, it may be okay.

Are you okay?
panjet 2002-01-07
  • 打赏
  • 举报
回复
帮不上你,顶一下.
ed9er 2002-01-07
  • 打赏
  • 举报
回复
补充,如果不是在初始化过程中操作list,而等到初始化完成后调用dll中的函数操作,则正常,当然我考虑过是初始化过程中dll用到的dll的section没有初始化,但为什么不用lib时就是好的呢?


15,447

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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