在MIDL中定义可选的char / wchar_t指针参数

时间:2016-01-24 14:47:40

标签: c++ com vb6 midl typelib

我有一个现有的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默认值吗?或者我在这里运气不好?

0 个答案:

没有答案