Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1081360732
DDA
2004-04-07 21:58
2004.04.25
ListView in Report


1-1081582624
KEBZ
2004-04-10 11:37
2004.04.25
ProgressBar1


1-1081630447
Klopan
2004-04-11 00:54
2004.04.25
сохранение/загрузка ListView в/из файл.


14-1080684740
ИМХО
2004-03-31 02:12
2004.04.25
Посоветуйте проверенную прогу


1-1081511875
basken
2004-04-09 15:57
2004.04.25
Столкнулся с проблемой при приминении паттерна стратегия





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский