首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • DLL与string [已结帖,结帖人:czcwzw]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于: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  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhoujianhei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 11:33:481楼 得分: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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 11:37:292楼 得分:0
    我用的是 DEF文件来导出
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qiandayong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 12:12:473楼 得分:5
    mark

    string aaa(string &str) 试试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhouzhenyan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 12:20:044楼 得分:0
    跟踪调试运行看看。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zoulie
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 12:27:255楼 得分:0
    用dumpbin看下有没有导出
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 8

      2

      19

    发表于:2008-11-17 12:27:576楼 得分:0
    代码没什么问题,是不是程序结束太快,没来得及显示?你开个命令提示窗口来运行试试。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiangsheng
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 12:35:377楼 得分:5
    不要导出可能有歧义的或者有静态成员的C++类。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • healer_kx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 12:57:558楼 得分:5
    引用 7 楼 jiangsheng 的回复:
    不要导出可能有歧义的或者有静态成员的C++类。


    UP这个,
    特别是在VC6中,你就不应该使用std::string作为返回值。
    除非你改设置,让这些模块链接到同样的CRT中。

    你应该返回char*
    并且提供Release(char* p)方法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 16:54:329楼 得分:0
    to 5楼的:导出了

    to 6楼的:不是,测试程序是控制台的,我在vc6下运行的不是直接运行exe,所以不会太快;

    to 7楼的:"不要导出可能有歧义的或者有静态成员的C++类。"

            我的那个导出函数有问题吗??
            "有歧义"是什么意思

    to 8楼的:特别是在VC6中,你就不应该使用std::string作为返回值。
            为什么啊???
            除非你改设置,让这些模块链接到同样的CRT中。
            什么意思啊???什么叫链接到同样的CRT中?????怎么改设置???

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyopencv
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 17:14:0210楼 得分:0
    程序应该没问题,问题还是在于你没有把DLL函数导出来。要么就是这里有问题:#pragma comment(lib, "MFC DLL.lib")
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 17:18:4511楼 得分:0
    我已经查了,有导出,请放心.

    可能是接口不能用string,改成char*就可以,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 17:25:3912楼 得分: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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 17:33:0413楼 得分:0
    DLL的接口是不是都用C接口比较好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 8

      2

      19

    发表于:2008-11-17 18:46:3914楼 得分:0
    把你的代码打包上传,让大家看看。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fox000002
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 18:53:5715楼 得分:5
    引用 13 楼 czcwzw 的回复:
    DLL的接口是不是都用C接口比较好


    写成 C 的话,比较通用

    在跨语言的时候体现的最为明显
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ilovedrv
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 19:18:2216楼 得分:0
    把动态库改成扩展mfc风格试试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 21:14:1517楼 得分:0
    代码已上传,麻烦大家了:

    http://czcwzw.download.csdn.net/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 21:15:1918楼 得分:0
    代码已上传,麻烦大家了:

    http://czcwzw.download.csdn.net/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhoujianhei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 21:46:2719楼 得分:5
    std::string
    释放了不是它分配的空间,无论是参数还是返回值都不要使用string。包括STL。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zengkun100
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 22:30:5820楼 得分:5
    当我看到你的工程还是vc6的时候很无语,你的工程不需要做任何改动,在vs2008里运行的很好。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xingworld
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 00:57:0921楼 得分: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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 8

      2

      19

    发表于:2008-11-18 16:23:3522楼 得分:0
    这个问题与MFC库的连接方式无关,与函数的导出方式也无关。问题是由于string所使用的缓冲区是在EXE中分配的,而在DLL中需要释放,这种跨模块分配和释放内存的做法是不安全的,VC把它视作错误,在Debug版中设置了检查机制,不允许跨模块释放。用Release版运行应该就不报错了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 19:12:0823楼 得分:0
    "问题是由于string所使用的缓冲区是在EXE中分配的,而在DLL中需要释放",

    不太理解??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 8

      2

      19

    发表于:2008-11-19 01:11:2924楼 得分:0
    string对象在构造时分配缓冲区,析构时释放缓冲区。函数参数中的对象是由调用者构造,函数返回前析构的。对于你的程序,调用部分是在EXE中,函数是在DLL中。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-19 11:41:0025楼 得分:0
    那不是不能使用类类型吗??使用类类型,不是都会有上述的情况发生
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 8

      2

      19

    发表于:2008-11-19 13:07:1726楼 得分:70
    可以用引用型参数或传递对象指针。另外,所谓不安全也不是说一定会出问题,只要各个模块管理内存的方式一致,是可以使用的,但只能用release版。
    修改 删除 举报 引用 回复