新建动态链接库NEWDLL
NEWDLL.h中:
extern "C" _declspec(dllexport) string transfer2Pin(string input);
NEWDLL.cpp中:
#include <string>
using namespace std;
#include "NEWDLL.h"
string transfer2Pin(string input)//函数实现汉字转换拼音的功能
{
string result;//返回值
...//过程略,VC中建工程直接调用此函数可以返回正确的result
return result;
}
然后新建一个工程调用这个NEWDLL.dll
#include <iostream>
#include <string>
using namespace std;
#include <windows.h>
int main()
{
string a,b;
typedef string(* ptransfer2Pin)(string);
HINSTANCE hDLL=NULL;
ptransfer2Pin transfer2Pin;
hDLL=LoadLibrary("NEWDLL.dll");
if(hDLL!=NULL)
{
transfer2Pin=(ptransfer2Pin)GetProcAddress(hDLL,"transfer2Pin");
if(transfer2Pin!=NULL)
{
cout<<"请输入汉字:";
cin>>a;
b=transfer2Pin(a);
cout<<"转换结果是:"<<b<<endl;
}
FreeLibrary(hDLL);
}
return 0;
}
程序运行能得到正确的结果,但随后弹出来:
调用NEWDLL.exe已停止工作 出现了一个问题,导致程序停止正常工作...
大大们看看哪里出现问题?
NEWDLL.h中:
extern "C" _declspec(dllexport) string transfer2Pin(string input);
NEWDLL.cpp中:
#include <string>
using namespace std;
#include "NEWDLL.h"
string transfer2Pin(string input)//函数实现汉字转换拼音的功能
{
string result;//返回值
...//过程略,VC中建工程直接调用此函数可以返回正确的result
return result;
}
然后新建一个工程调用这个NEWDLL.dll
#include <iostream>
#include <string>
using namespace std;
#include <windows.h>
int main()
{
string a,b;
typedef string(* ptransfer2Pin)(string);
HINSTANCE hDLL=NULL;
ptransfer2Pin transfer2Pin;
hDLL=LoadLibrary("NEWDLL.dll");
if(hDLL!=NULL)
{
transfer2Pin=(ptransfer2Pin)GetProcAddress(hDLL,"transfer2Pin");
if(transfer2Pin!=NULL)
{
cout<<"请输入汉字:";
cin>>a;
b=transfer2Pin(a);
cout<<"转换结果是:"<<b<<endl;
}
FreeLibrary(hDLL);
}
return 0;
}
程序运行能得到正确的结果,但随后弹出来:
调用NEWDLL.exe已停止工作 出现了一个问题,导致程序停止正常工作...
大大们看看哪里出现问题?
解决方案 »
- 怎么样使编辑框只能接受中文???
- 被主管批评的不行了,下面的代码什么问题?DestroyWindow(hwndtemp)窗口后连主窗口都看不见了,但可以find主窗句柄,重新show后看不到啊
- 调文档函数问题提示关闭应用程序,请各位指导谢谢!
- 在多文档视图中,程序一开始运行,只出现主框架,不打开一个文档,然后通过点击主窗口的菜单而再次弹出那个对话框呢
- 请教tab控件嵌套问题
- javascript里面怎么得到activex传过来的消息 和 javascript里面怎么让一个按钮变灰
- 这是为什么?????
- 为什么要使用调色板?
- 怎么制作透明对话框?
- 一个有关IE的问题
- SDI单文档多视图创建出错,请大家帮帮忙,很急
- 菜单按钮显示不出来
{
cout<<"请输入汉字:";
// cin>>a; //屏蔽这句试试,直接赋一个固定汉字
a="工";
b=transfer2Pin(a);
cout<<"转换结果是:"<<b<<endl;
}
没看出什么问题,直接赋一个汉字试试,有可能是主程序里的流程的问题,好象DLL还没处理完就注销DLL了
调用NEWDLL.exe已停止工作。 出现了一个问题,导致程序停止正常工作...
}
while(1);//加这句试试,程序死循环不干别的事,如果还弹出提示,就再屏蔽FreeLibrary(hDLL);这句,如果屏蔽这句还弹出提示,就查DLL这个transfer2Pin函数吧
return 0;
而这个临时对象是在DLL构造,在EXE里析构的,会造成跨模块分配、释放内存的问题DLL和EXE都改用CRT静态编译试试,可以看出问题
直接把string transfer2Pin(string input)函数放在EXE里试试
造成的.string 很少用,我用的CString在函数返回时 调用CString::AllocSysString,这样就会分配一个新的空间来保存返回值