Dan*_*ski 6 delphi string vb6 dll
我必须创建一个VB6应用程序使用的DLL.这个DLL必须提供几个函数,其中一些函数必须返回字符串.
这是VB6声明:
Declare Function MyProc Lib "mylib.dll" (ByVal Param As String) As String
Run Code Online (Sandbox Code Playgroud)
这就是Delphi实现存根mylib.dll:
function MyProc(AParam: PChar): PChar; stdcall;
var
ReturnValue: string;
begin
ReturnValue := GetReturnValue(AParam);
Result := ???;
end;
Run Code Online (Sandbox Code Playgroud)
我有什么要回到这里?谁将释放回归PChar字符串的记忆?
编辑:我问的是Delphi 2005(PChar= PAnsiChar)
你需要制作一个BSTR.VB6字符串实际上是BSTR.在Delphi端调用SysAllocString()并将BSTR返回到VB6端.VB6端必须调用SysFreeString()来释放字符串 - 它会自动执行.
如果PChar对应于ANSI字符串(您的情况),您必须手动将其转换为Unicode - 使用MultiByteToWideChar().有关如何更好地一起使用SysAllocStringLen()和MultiByteToWideChar()的信息,请参阅此答案.
如果您不想冒险崩溃或内存泄漏,请使用Windows API作为模型来制作API.在那里,API函数通常不分配自己的内存.相反,调用者传递缓冲区并告诉API缓冲区有多大.API将缓冲区填充到该限制.GetWindowText例如,请参阅该功能.函数不返回指针,除非它们指向调用者已经提供的内容.相反,调用者自己提供一切,而函数只使用它给出的任何东西.您几乎从未看到输出缓冲区参数没有伴随另一个参数告知缓冲区的大小.
您可以对该技术进行进一步的增强是允许该函数告诉调用者缓冲区需要多大.当输入指针是空指针时,该函数可以返回调用者需要提供的字节数.调用者将调用该函数两次.
您无需从头开始派生API.使用已经在工作的API作为如何公开自己的API的示例.