Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Не могу передать строку в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
3-1080214290
viktor
2004-03-25 14:31
2004.04.25
SQL


1-1081630305
Klopan
2004-04-11 00:51
2004.04.25
команда net send user message


1-1081141869
AmazedDexter
2004-04-05 09:11
2004.04.25
Recursively using


1-1081154455
MegaVolt
2004-04-05 12:40
2004.04.25
Как преместить данные в буфер не с начала?


14-1080899426
Andryk
2004-04-02 13:50
2004.04.25
Народ есть вопросец!