dll工程中导出函数:
extern "C" _declspec(dllexport)  void GetString(char* ReturnString)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
        ReturnString="hello";
}test工程中调用:char* teststr=NULL;
HINSTANCE hinst=LoadLibrary("dll.dll");//load dll
if(hinst)
{
   typedef void (WINAPI *func)(char* str);
   func gettext=(fun)GetProcAddress(hinst,"GetString");
   if(gettext)
   {
gettext(searchText); 
    }
    FreeLibrary(hinst);//free 
    return 1;
}
else
{
    MessageBox(0,"have not find dll.dll!","Error",MB_OK);
    return 0;
}
经过测试觉得好像是gettext不存在,但是具体不知道哪里出问题,请大家帮忙分析一下吧,谢谢了。

解决方案 »

  1.   

    弄错了,应该是gettext(teststr),不是gettext(searchText),笔误
      

  2.   

    你的错误主要是:
    虽然ReturnString="hello";
    但是由于C的传值机制,所以teststr不可能指向"hello".
    应该改为引用类型。
      

  3.   

    dll工程中导出函数:
    extern "C" _declspec(dllexport)  void GetString(char* ReturnString)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
            strcpy(ReturnString,"hello");
    }test工程中调用:char* teststr=NULL;
    HINSTANCE hinst=LoadLibrary("dll.dll");//load dll
    if(hinst)
    {
       typedef void (WINAPI *func)(char* str);
       func gettext=(fun)GetProcAddress(hinst,"GetString");
       if(gettext)
       {
    char searchText[256];
    gettext(searchText); 
        }
        FreeLibrary(hinst);//free 
        return 1;
    }
    else
    {
        MessageBox(0,"have not find dll.dll!","Error",MB_OK);
        return 0;
    }
      

  4.   

    yongdu() ,你不怕传进来的指针是没分配内存的吗?我觉得应该在DLL中申请内存,调用者负责释放。
      

  5.   

    dll工程中导出函数:
    extern "C" _declspec(dllexport)  void GetString(char** ReturnString)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
            *ReturnString="hello";
    }test工程中调用:char* teststr=NULL;
    HINSTANCE hinst=LoadLibrary("dll.dll");//load dll
    if(hinst)
    {
       typedef void (WINAPI *func)(char* str);
       func gettext=(fun)GetProcAddress(hinst,"GetString");
       if(gettext)
       {
    gettext(&searchText); 
        }
        FreeLibrary(hinst);//free 
        return 1;
    }
    else
    {
        MessageBox(0,"have not find dll.dll!","Error",MB_OK);
        return 0;
    }
      

  6.   

    不行阿,大家给的修改代码用了还是不行,有没有别的办法。yongdu的代码可以使导出函数有效,只是传出来的是一些乱码,不是我需要的从导出函数导出来的字符串。
      

  7.   

    乱码?可能吗?
       if(gettext)
       {
    char searchText[256];
    gettext(searchText); 
    ::MessageBox(NULL, searchText, NULL, 0); //加此句打印出来看看,如果成功调用,不会是乱码
        }sboom(LingCh)说的方法其它不好,因为从习惯和代码风格上看,放在一个模块上是最好的。调用前申请,调用后释放。这也是几乎所有api的调用机构。只有少数api才是在它的dll分配分存,要求调用者释放的。
      

  8.   

    to yongdu :
     我试了一下代码,觉得字符串应该是传得过来的,但是运行程序后,出现微软的发送错误报告对话框,我以为程序其他部分出问题,但是我把这段调用dll代码加入到其他程序中,运行后程序也出现类是错误,不知道怎么回事?怎么传个字符串这么麻烦?
      

  9.   

    extern "C" _declspec(dllexport)  void GetString(char* ReturnString)
    你干脆改成 char * GetString()算了。
    实现部分用return "jjjjj";
    试试。
      

  10.   

    改三处地方:一.导出函数的的参数应该是(char **pp)
    二.函数体strncpy(*pp,"abcefg",6);
    三.exe调用时先char *p = new char[100];再gettext(&p);关键是&p
      

  11.   

    dll工程中导出函数:
    extern "C" _declspec(dllexport)  void GetString(char* &ReturnString)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
            ReturnString = new char[6];
            strcpy(ReturnString,"hello");
    }test工程中调用:char* teststr=NULL;
    HINSTANCE hinst=LoadLibrary("dll.dll");//load dll
    if(hinst)
    {
       typedef void (WINAPI *func)(char* str);
       func gettext=(fun)GetProcAddress(hinst,"GetString");
       if(gettext)
       {
    gettext(searchText); 
        }
        FreeLibrary(hinst);//free 
        return 1;
    }
    else
    {
        MessageBox(0,"have not find dll.dll!","Error",MB_OK);
        return 0;
    }