c - VB6 - 如何通过 .tlb 文件将字符串传递给用 C 编写的 DLL

标签 c windows dll vb6 idl

我正在开发一个用 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/

相关文章:

c# - 获取图像以形式显示 - dll 文件

c - spoj 的时间限制超出错误。我如何改进我的解决方案?

c - OpenMP 任务 - 为什么在 ~10k 的迭代次数较多时会出现段错误?

c++ - Windows 风格的 getopt/argp

windows - 腻子错误 : Unable to open connection to hostname : Host does not exist

c# - Asp.Net 身份本地化 PublicKeyToken

c - ‘While’不断重写数组

c++ - 函数定义的源文件

c# - 以编程方式确定 Oracle Home 安装版本?

c++ - 在可执行文件中使用嵌入的 .dll