首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

DLL有关问题,欢迎讨论

2012-09-12 
DLL问题,欢迎讨论DLL中导出函数:C/C++ codeextern C BSTR __declspec(dllexport) __stdcall GetStr(){Wi

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内部适当的时候释放。

[解决办法]
参考

热点排行