|
|
|
Возврат данных из DLL?
|
|||
|---|---|---|---|
|
#18+
Код длл: 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)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 21:59 |
|
||
|
Возврат данных из DLL?
|
|||
|---|---|---|---|
|
#18+
karp2005вызывающая программа: { wstring test = L"ewrewreuiouiouowrewdsfsdfds"; //это надо изменить ........ EnumInterface(&test[0]); ........ } родной мой, но кто же так пишeт ? wstring - это же не массив символов. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 22:37 |
|
||
|
Возврат данных из DLL?
|
|||
|---|---|---|---|
|
#18+
Можете выделять память как угодно, главное чтобы удаление ее производилось так же, через тот же набор функций. И через тот же хип. Например: вы используете для выделения и уничтожения памяти Win32 API. Или вы используете для этого CRTL malloc/free. Или вы используете для этого С++ new/delete. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2006, 22:49 |
|
||
|
Возврат данных из DLL?
|
|||
|---|---|---|---|
|
#18+
Lepsik родной мой, но кто же так пишeт ? wstring - это же не массив символов. Код: plaintext 1. 2. Посмотрите в режиме отладки и увидете, что по этому адресу харнится 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2006, 01:37 |
|
||
|
Возврат данных из DLL?
|
|||
|---|---|---|---|
|
#18+
Cудя повсему проблемма тут: wcscpy((LPWSTR)p_outString,(LPWSTR)strGuid); если это закоментировать то не слетаем...Как это поправить? что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2006, 01:40 |
|
||
|
Возврат данных из DLL?
|
|||
|---|---|---|---|
|
#18+
Вообще по COM стандартам необходимо делать через SysAllocString и p_outString указатель на BSTR (указатель на указатель выделенной памяти) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2006, 09:26 |
|
||
|
Возврат данных из DLL?
|
|||
|---|---|---|---|
|
#18+
Спасибо, разобрался. Кому ещё интересно - 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2006, 00:34 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2029833]: |
0ms |
get settings: |
4ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
164ms |
get topic data: |
6ms |
get first new msg: |
3ms |
get forum data: |
2ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 416ms |

| 0 / 0 |
