我用以下方法定义了一个DLL,可执行到
filepath = ls_temp.c_str();时就出现错误,各位是什么原因呢?extern "C" __declspec(dllexport) void  GetHisFilePath(CString &filepath)
{
    char FileName [300];
    string File;
    ::GetModuleFileName(0,FileName,300);//取得可执行文件名
    int len = 0,find_old = 0,k = 0;
    File = FileName;
    len = File.length();
    for(int i=1;i<=len;i=k+1)
    {
        k = 0;
        k = File.find("\\",i);
        if(k == -1)
            break;
        find_old = k;
    }
    string ls_temp;
    ls_temp = File.substr(0,find_old);    AfxMessageBox(ls_temp.c_str());    filepath = ls_temp.c_str();
}

解决方案 »

  1.   

    跨进程调用,CString是动态分配内存的,对象由主程序创建,内存由动态库分配(给CString对象赋值时会有内存分配的操作),违背了VC的常规,故出错,此错误的release版中不会出现。debug版一定会出现。若“只有Release版可以”这种情况不愿接受,办法就是不用CString作为接口参数,使用指定空间的字符串变量,接口可该为:extern "C" __declspec(dllexport) void  GetHisFilePath(char[] szReturn)
      

  2.   

    extern "C" __declspec(dllexport) void  GetHisFilePath(char *filepath)
    {
    char FileName [300];
    string File;
    ::GetModuleFileName(0,FileName,300);//取得可执行文件名
    int len = 0,find_old = 0,k = 0;
    File = FileName;
    len = File.length();
    for(int i=1;i<=len;i=k+1)
    {
    k = 0;
    k = File.find("\\",i);
    if(k == -1)
    break;
    find_old = k;
    }
    string ls_temp;
    ls_temp = File.substr(0,find_old); AfxMessageBox((char*)ls_temp.c_str());
    filepath = (char*)ls_temp.c_str();
    }
    我修改成上面的语句,并在客户程序中分配内存空间也不行呀。
      

  3.   

    .c_str()是不可靠的,它是临时的用String对象保存指针,最好是strcpy到自己的空间
      

  4.   

    cb中是这样的,不知道vc的c_str()是什么机制
      

  5.   

    我在afxMessageBox()时是正确的,c_str()是容器string的一个函数,原型为const char* string.c_str()
      

  6.   

    extern "C" __declspec(dllexport) void  GetHisFilePath(char *filepath)
    {
    char FileName [300];
    string File;
    ::GetModuleFileName(0,FileName,300);//取得可执行文件名
    int len = 0,find_old = 0,k = 0;
    File = FileName;
    len = File.length();
    for(int i=1;i<=len;i=k+1)
    {
    k = 0;
    k = File.find("\\",i);
    if(k == -1)
    break;
    find_old = k;
    }
    string ls_temp;
    ls_temp = File.substr(0,find_old+1);
    len = ls_temp.length();
    ls_temp.copy(filepath,len); 我作以下修改即可
    filepath[len] = '\0';
    }