Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, karp2005, Вы писали:
K>>Есть такой код на C++ (DLL):
Vi2>K>>extern "C" __declspec(dllexport) void EnumInterface(LPCTSTR p_outString) //указатель на строку
K>>{
K>>.....объявление переменных........
K>>RPC_WSTR strGuid = NULL;
K>>__try
K>>{
K>>..............некоторые действия.................................
K>>if (UuidToStringW(&pIntfList->InterfaceInfo.InterfaceGuid, &strGuid) == RPC_S_OK)
K>>{
K>>wcscpy((LPWSTR)p_outString,(LPWSTR)strGuid);
K>>RpcStringFreeW(&strGuid);
K>>}
K>>}
K>>__finally
K>>{
K>>....очищаем память....
K>>}
K>>}
Vi2>
K>>Вопрос:
K>>1. правильно ли я возвращаю строку копируя её в область памяти, выделеной вызывающим процессом? (в случае с С — нечто типа wchar_t *test; test = new wchar_t[64]
Vi2>Правильно, но если учесть, что LPCTSTR — это не совсем LPWSTR, то неправильно.
K>>2. Как правильно эту ДЛЛ вызвать из VB6 (чтобы вернуть в вызывающую программу строку wstring)?
Vi2>Никак, потому что VB умеет вызывать только stdcall функции.
Поправил:
extern "C" void __declspec(dllexport) __stdcall EnumInterface(LPWSTR p_outString)
Теперь правильно?
Обращаюсь из VB k DLL так:
Declare Function EnumInterface Lib "С:\mydll.dll" (ByVal lpBuffer As String)
' Резервируется буфер, достаточный для
' размещения полного имени каталога
BufferLength& = 256
Buffer$ = Space$(BufferLength)
Call EnumInterface(Buffer$)
И тут мы слетаем......
Что я делаю снова не правильно?