У меня есть существующая 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
значение по умолчанию? Или мне просто не повезло здесь?
Задача ещё не решена.
Других решений пока нет …