我在程序中显式链接dll,但是调用完毕后,总是出错,跟踪一看是删除某个对象时出错。
那位大虾解决一下。
代码:
typedef void (*pSnippet) (char* path, string& text, string& query, string& snip);
HINSTANCE hDLL;
pSnippet snippet;
hDLL = LoadLibrary("Dll3.dll");
snippet = (pSnippet)GetProcAddress(hDLL,"Snippet");
char* path = "../config";
string query = m_query.GetBuffer();
m_query.ReleaseBuffer();
string body = mwmi.m_szBody.GetBuffer();
mwmi.m_szBody.ReleaseBuffer();
string snip ;
(*snippet)(path,body,query,snip);
FreeLibrary(hDLL);
那位大虾解决一下。
代码:
typedef void (*pSnippet) (char* path, string& text, string& query, string& snip);
HINSTANCE hDLL;
pSnippet snippet;
hDLL = LoadLibrary("Dll3.dll");
snippet = (pSnippet)GetProcAddress(hDLL,"Snippet");
char* path = "../config";
string query = m_query.GetBuffer();
m_query.ReleaseBuffer();
string body = mwmi.m_szBody.GetBuffer();
mwmi.m_szBody.ReleaseBuffer();
string snip ;
(*snippet)(path,body,query,snip);
FreeLibrary(hDLL);
解决方案 »
- ======请教 mfc winmain 在哪=====
- Help!最小化到托盘问题
- SDK 改变窗口图标(不用资源文件)
- 有关firefox,哪位大侠知道如何在我自己写的firefox里面,得到firefox实例,比如nsIWebBrowser,然后通过它操作firefox,还有如何截获firefox的events,IE可以用BHO解决,但是firefox怎么弄,急啊,救命啊
- 怎么样在vc里面调用com中的对象呀?急,快,我要搞netmeeting!!!!!
- no fen
- *.bmp和*.jpg文件的文件结构有什么不同?
- 菜鸟求救:两个很简单的问题?
- 怎样用MFC生成自己需要的窗体和怎样在客户区显示一个文件的内容
- jason802(小糊涂仙):请你为这件事向大家解释一下 (konfyt)
- 我是初学者请问 OVERLAPPED 这个结构的定义在哪里可以查得到
- 在CFileDialog中如何截获用户点击文件列表中一个文件的消息
该为:snippet(path,body,query,snip);
记得看到c++prime上说函数指针用不用*都一样的。
所以应该不是(*snippet)(path,body,query,snip)的问题吧
还记得宏__stdcall好像就是被定义成空的
__stdcall就不一样了,函数会清除调用者传入的堆栈段,或者用POP退栈,或者用RET N方式。通常你用DEPENDS看到函数名不是abc@xxx的,就是用stdcall,所以要用stdcall
用(*snippet)应该是没有问题的
但是
typedef void (*pSnippet) (char* path, string& text, string& query, string& snip);后面三个参数声明的是string& 而你调用的时候直接是string
应该改为(*snippet)(path,&body,&query,&snip);
应该就没有问题了啊
不好意思,新手上路,请勿见怪
我想应该是
string snip ;此处的snip没有赋初值,而引用是要赋初值的
(*snippet)(path,body,query,snip);
这个调用中有三个参数传的是string的引用所以里面你很可能修改其中一个或多个
修改的时候string可能会重新分配内存,这时候dll调用的是dll当中的new
而回过头来,string的释放是要在exe中进行的,掉用的delete是exe中的delete
所以这样new和delete就不匹配了
如果真是这样的话,有一个最简单的解决方法
编译exe和dll的时候,Debug版本使用Multiple Thread DLL Debug Library
Release版本使用Multiple Thread Library这样new和delete就都是msvcrt.dll里面的new和delete了
从而使之匹配
还是使用的 #include <string>里面的
是不是在Snippet函数里出错了啊
Snippet里面都做什么了啊
下面是dll中的函数定义void Snippet(char* path,string& text , string& query , string& snip)
{
Snippet4NG* pSnippet = new Snippet4NG();
pSnippet->Init(path);
pSnippet->GenerateSnippet(text,query,snip,"<b>","</b>");
}
修改程序如下
Snippet (char* path, string* body, string* query, string* snip )
所有问题ok
好像是常识
用作形参 string没有初始化
我在DLL中的输出函数是
LPVOID TranslateStr(CString& pParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pParam="Love";
return 0;
}
在EXE中调用代码如下
void C**View::OnDllTest()
{
CDC * pDC=GetDC();
HINSTANCE hInstance;
typedef LPVOID(* STR_FUNC)(CString&);//请注意此处的定义
STR_FUNC pFunction;
VERIFY(hInstance=::LoadLibrary ("F:\\Eniac\\Test\\Test2\\DLL\\Debug\\DLL.dll")); VERIFY(pFunction=(STR_FUNC )::GetProcAddress(hInstance,"TranslateStr"));
CString pString;
(* pFunction)(pString);//请注意此处的调用
VERIFY(FreeLibrary(hInstance));
pDC->TextOut (40,140,pString);
ReleaseDC(pDC);
}
结果可以输出Love
我试过的,不信楼上的和楼主也可以试一下