Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизНе могу передать строку в DLL на VC++6 Найти похожие ветки
← →
TALLA © (2004-04-06 01:35) [0]DLL написана мной.
pGetData: function(Var st:PChar): boolean; cdecl;
...
Var st:PChar;
begin
GetMem(st,256);
ZeroMemory(st,256);
st[0]:="5";
Result:=pGetData(st);
s:=strpas(st);
FreeMem(st,256);
end;
← →
TALLA © (2004-04-06 01:50) [1]В DLL MessageBox выводит ерунду вместо "5", пишет в st нормально (проверено при отладке DLL), но в Delphi в строке s:=strpas(st) получаю AccessViolation
← →
Alex Konshin © (2004-04-06 01:55) [2]А как она описана в VC?
← →
Германн © (2004-04-06 01:59) [3]И где ошибка? И какая ошибка? И где полный код функции в DLL и полный код вызова оной?
Имхо, опять "пойди туда не знаю куда, найди то не знаю что"! :(((
Ну как вас заставить грамотно формулировать свои вопросы?
Имхо, никак. (Тихо сам с собою...)
Только опыт поможет, может быть. :(((
← →
TALLA © (2004-04-06 02:07) [4]To Германн:
>полный код вызова оной?
в самом первом сообщении. полнее некуда.
>И где ошибка?
В сообщении [1] написано, не могу даже память st освободить.
В DLL:
MessageBox(0,msg,"",MB_OK);
...
sprintf(msg,"not connected");
return false;
← →
TALLA © (2004-04-06 02:10) [5]В DLL объявление функции:
extern "C" __declspec(dllexport) bool GetData(char* msg)
{
текст из [4]
}
← →
Германн © (2004-04-06 02:20) [6]2 TALLA © (06.04.04 02:07) [4]
>To Германн:
>>полный код вызова оной?
>в самом первом сообщении. полнее некуда.
Ну если "полнее некуда", то что такое "s"?
Неужели вы думаете, что приведя строки:
В DLL:
MessageBox(0,msg,"",MB_OK);
...
sprintf(msg,"not connected");
return false;
что-то должно стать понятнее?
← →
Alex Konshin © (2004-04-06 02:24) [7]У тебя несоответствие типов параметров.
В C должен быть тип char** msg, если уж в Delphi var st: PChar.
И еще меня смущает типы bool и boolean, IMHO они разные, я бы, чтобы не рисковать, использовал бы BOOL или вообще DWORD.
Не знаю, важно ли это для тебя, но как-то принято для dll функций использовать stdcall.
← →
TALLA © (2004-04-06 02:26) [8]то что такое "s"?
function GetData(Var s:string):boolean;
Var st:PChar;
begin
GetMem(st,256);
ZeroMemory(st,256);
st[0]:="5";
Result:=pGetData(st);
s:=strpas(st);
FreeMem(st,256);
end;
А что еще я должен привести из текста DLL, если это все?
msg при выводе на экран содержит мусор, при отладке в msg записывается строка "not connected", а Delphi при любых манипуляциях с st получаю AccessViolation: read of addresss ...
← →
TALLA © (2004-04-06 02:35) [9]To Alex Konshin:
Если в VC++ делаешь stdcall, то имя функции превращается в ?GetData??xvnbs? типа этого. Я не знаю, как это исправить, по индексу импортировать нельзя по условию.
Да, должен быть тип char** msg. После исправления, все заработало ок:)
← →
Alex Konshin © (2004-04-06 02:40) [10]если у тебя extern "C", то будет так, как надо, а ?GetData??... получается, если у тебя нет этого extern "C", собственно, именно для этого этот префикс и ставится.
← →
TALLA © (2004-04-06 02:49) [11]А куда в VC++ нужно поставить stdcall(или его альтернативу)?
← →
Alex Konshin © (2004-04-06 03:10) [12]На вскидку не помню (обычно используются всякие макросы), но по-моему просто __stdcall перед объявлением функции.
← →
Suntechnic © (2004-04-06 04:08) [13]Во-первых меня сильно смущает троеточие в
MessageBox(0,msg,"",MB_OK);
...
sprintf(msg,"not connected");
Боже упаси, если там какой-нибудь strcpy или ещё чего-нибудь модифицирующее msg.
Второе. Если надо сделать stdcall, то в прототипе ф-ции на C надо писать __stdcall после возвращаемого значения перед именем ф-ции.
И последнее. extern "C" не сделает "так как надо" :) extern "C" даст имя типа _function. Чтобы было красиво надо создать .def файл, включить его в проект и написать там что экспортируется.
Пример TestDll.def файла:; TestDll.def : Declares the module parameters for the DLL.
LIBRARY "TestDll"
DESCRIPTION "TestDll Dynamic Link Library"
EXPORTS
TestFunction
Имя ф-ции в разделе EXPORTS обязано совпадать с именем ф-ции в модуле иначе получишь ошибку линковщика. (если хочешь дать ф-ции другое имя, для этого имеется соотв. синтаксис раздела EXPORTS)
← →
Alex Konshin © (2004-04-06 04:31) [14]Очень может быть.
Я делал как надо и у меня проблем не было. Вот если бы были, то я может и запомнил бы это на всю жизнь :).
А *.def я как-то считал само собой разумеющимся :)
← →
KSergey © (2004-04-06 08:40) [15]Я бы еще обратил внимание автора на то, что bool в Си и Boolean в паскале возможно не одно и тоже.
Впрочем, я не знаю как у него определено bool
Знаю только, что BOOL из windows.h и BOOL из дельфи (или bool - кому как проще, паскалю - пофигу) - точно одинаковы.
← →
Alex Konshin © (2004-04-06 08:48) [16]См.пост [7], я тоже ему об этом говорил, но похоже, что он это проигнорировал.
← →
PVOzerski © (2004-04-06 10:07) [17]1) >Если в VC++ делаешь stdcall, то имя функции превращается в ?GetData??xvnbs? типа этого.
У меня нет под рукой VC++, однако если это так, то: a) как насчет extern "C"? b) cdecl и pascal тоже не возбраняются. А вот register (то, что в Delphi по умолчанию) - :^(
2) если (var st:pChar), то (char** st)
← →
KSergey © (2004-04-06 11:04) [18]> [16] Alex Konshin © (06.04.04 08:48)
Да, не заметил
← →
TALLA © (2004-04-06 19:59) [19]Благодарность Suntechnic"у, Alex Konshin"у
Возмущение Германн"у
Тема закрыта
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c