我正在开发一个用 VB6 编写的图形界面,我必须在其中调用某个用 C 编写的 DLL 中包含的函数。因为 known limitation我必须实现 trick这允许我以隐式方式加载此 DLL。
这可以创建一个 IDL 文件,用 MIDL 编译它并在 VB6 项目中引用生成的 .tlb 文件。
问题是 VB6 字符串和 C 字符数组不匹配,所以我无法将它们传递(并取回)到 DLL。
C函数的原型(prototype)是:
int __stdcall myFunc(char filename_in[], char filename_out[], char ErrMsg[]);
我应该在 IDL 文件中写什么,我应该如何从 VB6 中调用它?
谢谢。
最佳答案
您必须使用 BSTR 才能使用 VB6 兼容字符串。它是标准的 COM 字符串类型,它以 utf-16 编码存储 Unicode 字符串,就像 Win32 api。
int __stdcall myFunc(BSTR filename_in, BSTR filename_out, BSTR* ErrMsg);
您可以将 in args 直接转换为 WCHAR*,如果需要转换为 char*(最好避免),请使用 WideCharToMultiByte()。如果 *ErrMsg
不为 null,则使用 SysFreeString 在分配之前释放现有字符串。使用 SysAllocString 分配 ErrMsg 字符串。它也必须是 utf-16 字符串,如果需要,再次使用 MultiByteToWideChar() 从 char* 转换。或者使用以 L 为前缀的字符串文字,例如 L"Oops"。
关于c - VB6 - 如何通过 .tlb 文件将字符串传递给用 C 编写的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231879/