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不存在,但是具体不知道哪里出问题,请大家帮忙分析一下吧,谢谢了。
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不存在,但是具体不知道哪里出问题,请大家帮忙分析一下吧,谢谢了。
虽然ReturnString="hello";
但是由于C的传值机制,所以teststr不可能指向"hello".
应该改为引用类型。
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;
}
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;
}
if(gettext)
{
char searchText[256];
gettext(searchText);
::MessageBox(NULL, searchText, NULL, 0); //加此句打印出来看看,如果成功调用,不会是乱码
}sboom(LingCh)说的方法其它不好,因为从习惯和代码风格上看,放在一个模块上是最好的。调用前申请,调用后释放。这也是几乎所有api的调用机构。只有少数api才是在它的dll分配分存,要求调用者释放的。
我试了一下代码,觉得字符串应该是传得过来的,但是运行程序后,出现微软的发送错误报告对话框,我以为程序其他部分出问题,但是我把这段调用dll代码加入到其他程序中,运行后程序也出现类是错误,不知道怎么回事?怎么传个字符串这么麻烦?
你干脆改成 char * GetString()算了。
实现部分用return "jjjjj";
试试。
二.函数体strncpy(*pp,"abcefg",6);
三.exe调用时先char *p = new char[100];再gettext(&p);关键是&p
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;
}