Определите необязательный параметр указателя char / wchar_t в MIDL

У меня есть существующая DLL-библиотека Win32 C ++, к которой должен обращаться клиент VB6. Одна из экспортируемых функций определяется следующим образом:

__declspec(dllexport) long __stdcall Foo(long nId, LPCWSTR pszwPath = nullptr);

К сожалению, VB6 всегда преобразует строки в ANSI при вызове функций DLL через Declare заявление. Чтобы обойти это ограничение, я встроил библиотеку типов, которая имеет следующую сигнатуру для функции:

[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 значение по умолчанию? Или мне просто не повезло здесь?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]