powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Возврат данных из DLL?
7 сообщений из 7, страница 1 из 1
Возврат данных из DLL?
    #34194828
karp2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код длл:

xtern "C" __declspec(dllexport) void EnumInterface(LPCTSTR p_outString)

{
...............
wcscpy((LPWSTR)p_outString,(LPWSTR)strGuid);
..............
}

вызывающая программа:
{
wstring test = L"ewrewreuiouiouowrewdsfsdfds"; //это надо изменить

........
EnumInterface(&test[0]);
........
}

Вопрос как выделить правильно память для возвращаемой строки, т.к. в таком виде получаю ошибку
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
хотя значение возвращается правильное.

Может у кого-то есть пример ДЛЛ возвращающее какие-то данные (кроме целого числа с помощью return)?
...
Рейтинг: 0 / 0
Возврат данных из DLL?
    #34194896
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karp2005вызывающая программа:
{
wstring test = L"ewrewreuiouiouowrewdsfsdfds"; //это надо изменить
........
EnumInterface(&test[0]);
........
}



родной мой, но кто же так пишeт ? wstring - это же не массив символов.

Код: plaintext
1.
2.
wchar_t *test = L"ewrewreuiouiouowrewdsfsdfds";   //так надо

EnumInterface( test );
...
Рейтинг: 0 / 0
Возврат данных из DLL?
    #34194912
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете выделять память как угодно, главное чтобы удаление ее производилось так же, через тот же набор функций. И через тот же хип.

Например: вы используете для выделения и уничтожения памяти Win32 API.
Или вы используете для этого CRTL malloc/free.
Или вы используете для этого С++ new/delete.
...
Рейтинг: 0 / 0
Возврат данных из DLL?
    #34195074
karp2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik


родной мой, но кто же так пишeт ? wstring - это же не массив символов.

Код: plaintext
1.
2.
wchar_t *test = L"ewrewreuiouiouowrewdsfsdfds";   //так надо

EnumInterface( test );


Посмотрите в режиме отладки и увидете, что по этому адресу харнится 0-й символ строки (&test[0]).
Согласен, нужно записать записать вот так:

wchar_t *test;
test = new wchar_t[64];

Но всёравно проблемма осталась. Вот текст:


typedef void (WINAPI*cfunc)(LPCTSTR);

cfunc EnumInterface;

int _tmain(int argc, _TCHAR* argv[])
{
wchar_t *test;
test = new wchar_t[64];
LPCTSTR p_strDllPath = L"C:\\MYTEST.DLL";
HINSTANCE hLib=LoadLibrary(p_strDllPath);
if(hLib==NULL)
{
//wcout << "Unable to load library!" << endl;


}

char mod[MAXMODULE]; //MAXMODULE = 50

GetModuleFileName((HMODULE)hLib, (LPTSTR)mod, MAXMODULE);
EnumInterface=(cfunc)GetProcAddress((HMODULE)hLib, "EnumInterface");
if(EnumInterface==NULL)
{

FreeLibrary((HMODULE)hLib);

}
EnumInterface(test);
--------->тут слетаем
FreeLibrary((HMODULE)hLib);
wcout << L"TESTME! " << (LPWSTR)test << endl; //значение типа f196fe46-3b60-4ffc-b4a3-66d4c95b8560

_getch();
delete test;

return 0;
}

В чём проблемма? может нужно сделать как-то по другому? хотя значения возвращает правильное:

(LPWSTR)test = f196fe46-3b60-4ffc-b4a3-66d4c95b8560

содержит то что нужно.


Сама библиотека:

extern "C" __declspec(dllexport) void EnumInterface(LPCTSTR p_outString)
{
.....объявление переменных........
RPC_WSTR strGuid = NULL;
__try
{
..............некотроые действия.................................
if (UuidToStringW(&pIntfList->InterfaceInfo .InterfaceGuid, &strGuid) == RPC_S_OK)
{
wcscpy((LPWSTR)p_outString,(LPWSTR)strGuid);
RpcStringFreeW(&strGuid);
}
}
__finally
{
....очищаем память....
}
}


Вот при возврате из библиотеки обратно в вызывающую функцию слетаем с ошибкой:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
...
Рейтинг: 0 / 0
Возврат данных из DLL?
    #34195077
karp2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cудя повсему проблемма тут:

wcscpy((LPWSTR)p_outString,(LPWSTR)strGuid);

если это закоментировать то не слетаем...Как это поправить? что не так?
...
Рейтинг: 0 / 0
Возврат данных из DLL?
    #34195369
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще по COM стандартам необходимо делать через SysAllocString
и p_outString указатель на BSTR (указатель на указатель выделенной памяти)
...
Рейтинг: 0 / 0
Возврат данных из DLL?
    #34198324
karp2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, разобрался.
Кому ещё интересно -

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnw32dev/html/ora_apiprog6_topic1.asp
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q205277
http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/VBA/Decoder/VBVariables1.mspx
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Возврат данных из DLL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]