Re[2]: Как получить строку из DLL на VB6
От: karp2005  
Дата: 13.12.06 10:28
Оценка:
Здравствуйте, 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$)
И тут мы слетаем......
Что я делаю снова не правильно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.