我有一个现有的Win32 C ++ DLL,需要VB6客户端访问。其中一个导出函数定义如下:
__declspec(dllexport) long __stdcall Foo(long nId, LPCWSTR pszwPath = nullptr);
不幸的是,VB6在通过Declare
语句调用DLL函数时总是将字符串转换为ANSI。为了绕过这个限制,我嵌入了一个类型库,它具有以下函数签名:
[uuid(...)]
library FooLib
{
[
helpstring("FooLib"),
dllname("Foo.dll")
]
module FooMdl
{
[entry("Foo")]
long __stdcall Foo([in] long nId, [in,unique,string,defaultvalue(0)] LPCWSTR pszwPath);
}
};
然而,这不会编译,因为MIDL会生成以下错误:
error MIDL2020 : error generating type library : AddFuncDesc failed : Foo
我的下一次尝试涉及使用optional
属性:
long __stdcall Foo([in] long nId, [in,unique,string,optional] LPCWSTR pszwPath);
虽然可以成功编译此类型库,但只要省略了可选字符串值,VB6客户端就会因访问冲突而崩溃。
我知道我可以将LPCWSTR
参数更改为BSTR
类型,从而解决问题。但是,这还需要我更改现有DLL的签名和实现。
因此可以将char
/ wchar_t
指针参数定义为可选参数或具有NULL
默认值吗?或者我在这里运气不好?