首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
VC/MFC
基础类
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结帖去...
管理菜单
页面风格切换
标准风格
老版本论坛
DLL与string
[已结帖,结帖人:czcwzw]
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
结帖率:
94.59%
发表于:
2008-11-17 11:22:14
楼主
做了一个MFC常规DLL,导出一个函数,且DLL的环境设置为使用MFC作为静态链接库
string aaa(string str)
{
return string(str+" OK!");
}
做了一个控制台程序来测试:
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib, "MFC DLL.lib")
string aaa(string str);
void main()
{
cout < <aaa("ddd") < <endl;
}
问题:运行时,没有输出,好像卡住了,
无论控制台程序的环境设为
1.不使用MFC
2.使用MFC作为DLL
3.使用MFC作为静态链接库
结果都一样,运行不出来?????
问题点数:
100
回复次数:
26
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhoujianhei
高手.高手.高高手
等级:
可用分等级:
掌柜
总技术分:
22536
总技术分排名:
519
发表于:
2008-11-17 11:33:48
1
楼 得分:
0
extern "C" __declspec(dllexport)
string aaa(string str)
{
return string(str+" OK!");
}
#include <iostream>
#include <string>
using namespace std;
extern "C" __declspec(dllimport)
string aaa(string str);
#pragma comment(lib, "MFC DLL.lib")
void main()
{
cout < <aaa("ddd") < <endl;
}
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-17 11:37:29
2
楼 得分:
0
我用的是 DEF文件来导出
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qiandayong
还没淹死的鱼
等级:
可用分等级:
中农
总技术分:
306
总技术分排名:
46816
发表于:
2008-11-17 12:12:47
3
楼 得分:
5
mark
string aaa(string &str) 试试
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhouzhenyan
周曹俊(周桢焱)
等级:
可用分等级:
富农
总技术分:
3167
总技术分排名:
6742
发表于:
2008-11-17 12:20:04
4
楼 得分:
0
跟踪调试运行看看。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zoulie
落伍者
等级:
可用分等级:
富农
总技术分:
1983
总技术分排名:
10893
发表于:
2008-11-17 12:27:25
5
楼 得分:
0
用dumpbin看下有没有导出
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cnzdgs
满天星
等级:
可用分等级:
乞丐
总技术分:
148237
总技术分排名:
23
8
2
19
发表于:
2008-11-17 12:27:57
6
楼 得分:
0
代码没什么问题,是不是程序结束太快,没来得及显示?你开个命令提示窗口来运行试试。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
jiangsheng
蒋晟
等级:
可用分等级:
大地主
总技术分:
332074
总技术分排名:
5
发表于:
2008-11-17 12:35:37
7
楼 得分:
5
不要导出可能有歧义的或者有静态成员的C++类。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
healer_kx
甘草
等级:
可用分等级:
大地主
总技术分:
40863
总技术分排名:
221
发表于:
2008-11-17 12:57:55
8
楼 得分:
5
引用 7 楼 jiangsheng 的回复:
不要导出可能有歧义的或者有静态成员的C++类。
UP这个,
特别是在VC6中,你就不应该使用std::string作为返回值。
除非你改设置,让这些模块链接到同样的CRT中。
你应该返回char*
并且提供Release(char* p)方法。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-17 16:54:32
9
楼 得分:
0
to 5楼的:导出了
to 6楼的:不是,测试程序是控制台的,我在vc6下运行的不是直接运行exe,所以不会太快;
to 7楼的:"不要导出可能有歧义的或者有静态成员的C++类。"
我的那个导出函数有问题吗??
"有歧义"是什么意思
to 8楼的:特别是在VC6中,你就不应该使用std::string作为返回值。
为什么啊???
除非你改设置,让这些模块链接到同样的CRT中。
什么意思啊???什么叫链接到同样的CRT中?????怎么改设置???
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyopencv
happyopencv
等级:
可用分等级:
贫农
总技术分:
221
总技术分排名:
57511
发表于:
2008-11-17 17:14:02
10
楼 得分:
0
程序应该没问题,问题还是在于你没有把DLL函数导出来。要么就是这里有问题:#pragma comment(lib, "MFC DLL.lib")
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-17 17:18:45
11
楼 得分:
0
我已经查了,有导出,请放心.
可能是接口不能用string,改成char*就可以,
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-17 17:25:39
12
楼 得分:
0
还有一个问题:
我改成
char* aaa(char* str) 且DLL的环境设置为使用MFC作为静态链接库
那么测试程序为控制台,且只有当测试程序设置为:使用MFC作为DLL时才能运行,否则出错.为什么???
以上的问题就是我另一篇帖子的问题:
http://topic.csdn.net/u/20081117/11/e306f8bf-b509-420d-a37f-a485c86ae351.html
to cnzdgs:
通过这个问题,就可以证明你在我的另一篇帖子的回答好像不太正确.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-17 17:33:04
13
楼 得分:
0
DLL的接口是不是都用C接口比较好
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cnzdgs
满天星
等级:
可用分等级:
乞丐
总技术分:
148237
总技术分排名:
23
8
2
19
发表于:
2008-11-17 18:46:39
14
楼 得分:
0
把你的代码打包上传,让大家看看。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
fox000002
糊糊
等级:
可用分等级:
富农
总技术分:
7980
总技术分排名:
2553
发表于:
2008-11-17 18:53:57
15
楼 得分:
5
引用 13 楼 czcwzw 的回复:
DLL的接口是不是都用C接口比较好
写成 C 的话,比较通用
在跨语言的时候体现的最为明显
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ilovedrv
zhouzy
等级:
可用分等级:
掌柜
总技术分:
6277
总技术分排名:
3461
发表于:
2008-11-17 19:18:22
16
楼 得分:
0
把动态库改成扩展mfc风格试试
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-17 21:14:15
17
楼 得分:
0
代码已上传,麻烦大家了:
http://czcwzw.download.csdn.net/
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-17 21:15:19
18
楼 得分:
0
代码已上传,麻烦大家了:
http://czcwzw.download.csdn.net/
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhoujianhei
高手.高手.高高手
等级:
可用分等级:
掌柜
总技术分:
22536
总技术分排名:
519
发表于:
2008-11-17 21:46:27
19
楼 得分:
5
std::string
释放了不是它分配的空间,无论是参数还是返回值都不要使用string。包括STL。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zengkun100
水的影子
等级:
可用分等级:
富农
总技术分:
477
总技术分排名:
34410
发表于:
2008-11-17 22:30:58
20
楼 得分:
5
当我看到你的工程还是vc6的时候很无语,你的工程不需要做任何改动,在vs2008里运行的很好。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xingworld
穷男人
等级:
可用分等级:
长工
总技术分:
2304
总技术分排名:
9477
发表于:
2008-11-18 00:57:09
21
楼 得分:
0
建议:
1,用 DEF 导出函数
; MfcDll.def : Declares the module parameters.
LIBRARY "MfcDll.DLL"
EXPORTS
aaa
2,写个头文件,好给其他用,例如 MfcDll.h
这儿文件里是那个函数的定义
string aaa( string str );
然后就很简单了,需要用你这个 DLL 的人只要:
#include "MfcDll.h"
#pragma comment(lib, "MFC DLL.lib")
然后 aaa( string str ) 调用即可。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cnzdgs
满天星
等级:
可用分等级:
乞丐
总技术分:
148237
总技术分排名:
23
8
2
19
发表于:
2008-11-18 16:23:35
22
楼 得分:
0
这个问题与MFC库的连接方式无关,与函数的导出方式也无关。问题是由于string所使用的缓冲区是在EXE中分配的,而在DLL中需要释放,这种跨模块分配和释放内存的做法是不安全的,VC把它视作错误,在Debug版中设置了检查机制,不允许跨模块释放。用Release版运行应该就不报错了。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-18 19:12:08
23
楼 得分:
0
"问题是由于string所使用的缓冲区是在EXE中分配的,而在DLL中需要释放",
不太理解??
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cnzdgs
满天星
等级:
可用分等级:
乞丐
总技术分:
148237
总技术分排名:
23
8
2
19
发表于:
2008-11-19 01:11:29
24
楼 得分:
0
string对象在构造时分配缓冲区,析构时释放缓冲区。函数参数中的对象是由调用者构造,函数返回前析构的。对于你的程序,调用部分是在EXE中,函数是在DLL中。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
czcwzw
czcwzw
等级:
可用分等级:
中农
总技术分:
8
总技术分排名:
242720
发表于:
2008-11-19 11:41:00
25
楼 得分:
0
那不是不能使用类类型吗??使用类类型,不是都会有上述的情况发生
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cnzdgs
满天星
等级:
可用分等级:
乞丐
总技术分:
148237
总技术分排名:
23
8
2
19
发表于:
2008-11-19 13:07:17
26
楼 得分:
70
可以用引用型参数或传递对象指针。另外,所谓不安全也不是说一定会出问题,只要各个模块管理内存的方式一致,是可以使用的,但只能用release版。
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结帖去...
管理菜单
页面风格切换
标准风格
老版本论坛