DLL问题,欢迎讨论
DLL中导出函数:
- C/C++ code
extern "C" BSTR __declspec(dllexport) __stdcall GetStr(){ WideString s=str; return SysAllocString((BSTR)s);}工程中调用:
- C/C++ code
//---------------------------------------#include <vcl.h>#pragma hdrstop#include "Unit1.h"//---------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;HINSTANCE hdll;BSTR __stdcall (*GetStr)();//---------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}//---------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){ Memo1->Lines->Add(GetStr());}//---------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender){ hdll = LoadLibrary("TextHook.dll"); GetStr=GetProcAddress(hdll, "GetStr");}错误提示:[C++ Error] Unit1.cpp(34): E2034 Cannot convert 'int (__stdcall *)()' to 'wchar_t * (__stdcall *)()'
DLL中定义的GetStr函数的确是BSTR,为什么这里提示是 int???
[解决办法]
SysAllocString((BSTR)s);这句不知道是否可以,你可以调试一下,是不是这句出错。
可以用 WideString 的 Detach Attach 方法来实现。
DLL返回:ws.Detach()就可以了。Detach后,WideString不会释放该字串了,由调用者释放。
调用时用:
WideString A ;
A.Attach(GetStr());//这样返回的字符串经由A的释放而释放.
如果你用 SysAllocString 分配,那么调用者对应用 SysFreeString 来释放。WideString就是为COM中的BSTR而生的,我不是很清楚WideString内部机制是否调用了SysAllocString
上面的原则是:谁调用谁释放。
如果用谁申请谁释放的话,你应该返回一个 const BSTR 类型的只读指针。在DLL内部适当的时候释放。
[解决办法]
参考