做了一个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作为静态链接库
     结果都一样,运行不出来?????

解决方案 »

  1.   

    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; 
      

  2.   

    string aaa(string &str) 试试
      

  3.   


    UP这个,
    特别是在VC6中,你就不应该使用std::string作为返回值。
    除非你改设置,让这些模块链接到同样的CRT中。你应该返回char*
    并且提供Release(char* p)方法。
      

  4.   

    to 5楼的:导出了to 6楼的:不是,测试程序是控制台的,我在vc6下运行的不是直接运行exe,所以不会太快;to 7楼的:"不要导出可能有歧义的或者有静态成员的C++类。"         我的那个导出函数有问题吗??
             "有歧义"是什么意思to 8楼的:特别是在VC6中,你就不应该使用std::string作为返回值。
             为什么啊???
             除非你改设置,让这些模块链接到同样的CRT中。 
            什么意思啊???什么叫链接到同样的CRT中?????怎么改设置???
      

  5.   

    程序应该没问题,问题还是在于你没有把DLL函数导出来。要么就是这里有问题:#pragma comment(lib, "MFC DLL.lib") 
      

  6.   

    我已经查了,有导出,请放心.可能是接口不能用string,改成char*就可以,
      

  7.   

    还有一个问题:
    我改成
    char* aaa(char* str) 且DLL的环境设置为使用MFC作为静态链接库 那么测试程序为控制台,且只有当测试程序设置为:使用MFC作为DLL时才能运行,否则出错.为什么???以上的问题就是我另一篇帖子的问题:
    http://topic.csdn.net/u/20081117/11/e306f8bf-b509-420d-a37f-a485c86ae351.html
    to  cnzdgs:
     通过这个问题,就可以证明你在我的另一篇帖子的回答好像不太正确.
      

  8.   

    DLL的接口是不是都用C接口比较好
      

  9.   

    把动态库改成扩展mfc风格试试
      

  10.   

    代码已上传,麻烦大家了:http://czcwzw.download.csdn.net/
      

  11.   

    代码已上传,麻烦大家了:http://czcwzw.download.csdn.net/
      

  12.   

    std::string
    释放了不是它分配的空间,无论是参数还是返回值都不要使用string。包括STL。
      

  13.   

    当我看到你的工程还是vc6的时候很无语,你的工程不需要做任何改动,在vs2008里运行的很好。
      

  14.   

    建议:
    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 ) 调用即可。
      

  15.   

    这个问题与MFC库的连接方式无关,与函数的导出方式也无关。问题是由于string所使用的缓冲区是在EXE中分配的,而在DLL中需要释放,这种跨模块分配和释放内存的做法是不安全的,VC把它视作错误,在Debug版中设置了检查机制,不允许跨模块释放。用Release版运行应该就不报错了。
      

  16.   

    "问题是由于string所使用的缓冲区是在EXE中分配的,而在DLL中需要释放",不太理解??
      

  17.   

    string对象在构造时分配缓冲区,析构时释放缓冲区。函数参数中的对象是由调用者构造,函数返回前析构的。对于你的程序,调用部分是在EXE中,函数是在DLL中。
      

  18.   

    可以用引用型参数或传递对象指针。另外,所谓不安全也不是说一定会出问题,只要各个模块管理内存的方式一致,是可以使用的,但只能用release版。