在VC6下建立了一个mfc扩展Dll,其中有个函数的参数为CString类型。在VC05下创建了一个单文档程序来测试该dll,调用如下
CMultiColorStatic c;    //调用VC6下封装的类
CString str = _T("Hello world!");   //准备显示的字符
c.CStringTest("aaa")                //编译时产生错误 1 error C2664: “CMultiColorStatic::CStringTest”: 不能将参数 1 从“const char [4]”转换为“CString” d:\my documents\vc6\05\dlltest\dlltest\dlltestview.cpp 106
错误。如果调用c.CStringTest(str);  //则产生错误 1 error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __thiscall CMultiColorStatic::CStringTest(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" (__imp_?CStringTest@CMultiColorStatic@@QAEXV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z),该符号在函数 "public: void __thiscall CDllTestView::OnFileTest(void)" (?OnFileTest@CDllTestView@@QAEXXZ) 中被引用 DllTestView.obj
错误。但是最后我在VC6下调用时一切正常。谁来讲讲啊

解决方案 »

  1.   

    VS05 接受C字符串参数的CString构造函数是一个explicit
    你需要显式调用构造函数c.CStringTest(CString("aaa"));
      

  2.   

    接口参数尽量使用标准字符变量char,wchar
      

  3.   

    应该是字符集的问题吧
    你2005的工程是不是Unicode的
    改成多字节试试
      

  4.   

    改为2楼的朋友那样会出现错误 1 error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __thiscall CMultiColorStatic::CStringTest(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" (__imp_?CStringTest@CMultiColorStatic@@QAEXV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z),该符号在函数 "public: void __thiscall CDllTestView::OnFileTest(void)" (?OnFileTest@CDllTestView@@QAEXXZ) 中被引用 DllTestView.obj
    我在VC6下dll里面将测试函数加上默认参数void CStringTest(CString str = "success")后,
    在VC6引入库并创建对象调用该函数后能正常运行。在05下使用同一方法导入库,在编译阶段就出现错误 1 error C2440: “default argument”: 无法从“const char [8]”转换为“CString” d:\my documents\vc6\05\dlltest\multicolorstatic1.h 18
    错误。有没有办法能在不修改dll中此参数的类型,也能在05下成功调用的办法啊?(要求05下是Unicode)
      

  5.   

    现在又做了进一步测试,将VC6的DLL中加入一个Test函数void CMultiColorStatic::Test()
    {
    MessageBox("Test");  //或者MessageBox(_T("Test"));
    }
    在05里面调用都会出错。把这个函数改为返回一个int型的就不会出错,肯定是字符的问题,但是就是不知道从何下手
      

  6.   

    VC 低版本可以调用 高版本编译出来的库,但高版本不能调用低版本编译出来的库,除非你用低版本编译出来的库不使用MFC
      

  7.   

    “mfc扩展Dll”(这里假定导出类中有内存分配与回收)要求整个项目都要是dynamic CTR的。就是说VC6.0的MFC扩展DLL只能在VC6.0的项目里面使用,而且项目也必须是使用"动态方式链接MFC"的,并且在其它VS里是不可以使用的。
    确切的说,使用各个版本编译器编译的"MFC扩展DLL“,在其它版本编译器编译的程序中是不可以使用的。
    如果要获得通用性,推荐使用标准调用风格导出函数。
      

  8.   

    请教个菜问题:在这个vc6下生成的dll,其Test()
    {
    MessageBox("Test"); //或者MessageBox(_T("Test"));
    }
    函数在vc6下加载测试正确,在05下加载测试却要出错,是为什么
      

  9.   

    VC6的DLL->vc6的EXE
    VC2005DLL->VC2005EXE
    不同的一般不能混用,有些类是完全不同的,例如CSTRING
      

  10.   

    另外除非你的DLL是使用标准C接口的(也就是API)