Главная страница
    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.035 c
6-1077907167
ALeX.B.
2004-02-27 21:39
2004.04.25
Помогите! Нужен рабочий FTPServer!


3-1080621889
race1
2004-03-30 08:44
2004.04.25
autoupdate


14-1080633357
syte_ser78
2004-03-30 11:55
2004.04.25
Фильтр русских значений


1-1081586960
Анатолий Ксюндзский
2004-04-10 12:49
2004.04.25
Создание экзепляров компонентов в runtime


7-1078214864
Delmax
2004-03-02 11:07
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский