Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PChar in/out аргумент в DLL функции, PChar in/out аргумент в DLL функции 
:(
    Опции темы
ekianu
Дата 25.4.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 7.11.2006

Репутация: нет
Всего: нет



Привет всем.
Код

// DLL side
// mydll.dpr
function DLLFunc(var s: PChar): Boolean;
begin
  Result := False;
  with TDLLForm.Create(Application) do begin
    DLLEdit.Text := s;
    StrDispose(s);
    if ShowModal = mrOK then
      s := StrNew(PChar(DLLEdit.Text));
      Result := True;
   end;
end;
exports
  DLLFunc;

// EXE side
// usedll.dpr
function DLLFunc(var s: PChar): Boolean; stdcall; external 'mydll.dll';

...
procedure CallDLLFunc;
var
  s: PChar;
begin
  s := StrNew(MyList.Items[0]);
  if DLLFunc(s) then
    MyList.Items[0] := s;
  if Assigned(s) then
    StrDispose(s);
end;


После выхода из EXE постоянно выдает ACCESS VIOLATION. Пожалуйста помогите.

Это сообщение отредактировал(а) ekianu - 25.4.2010, 15:12
PM MAIL Skype   Вверх
Alexeis
Дата 25.4.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Нельзя в Dll удалять выделенную в exe память, и наоборот. Такая операция допустима при наличии общего менеджера памяти. Кстати при создании шаблона Dll об написан неслабый фрагмент текста.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ekianu
Дата 25.4.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 7.11.2006

Репутация: нет
Всего: нет



Значит нельзя использовать pchar in/out argument с Allocate/Deallocate.
PM MAIL Skype   Вверх
Alexeis
Дата 25.4.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(ekianu @  25.4.2010,  15:00 Найти цитируемый пост)
Значит нельзя использовать pchar in/out argument с Allocate/Deallocate. 

  WinApi функции так не делают, за исключением COM, где используется общий COM-ский менеджер памяти. Delphi разрешает такое делать через объединение менеджеров памяти (см. модуль ShareMem) или через тот же комовский менеджер (WideString). Или через самопальные аналоги FastShareMem


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ekianu
Дата 25.4.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 7.11.2006

Репутация: нет
Всего: нет



Спасибо Alexeis.
PM MAIL Skype   Вверх
kami
Дата 25.4.2010, 21:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Предлагаю еще обратить внимание на разные соглашения о вызовах при описании функции. Мне кажется, это основная проблема возникновения AV.
В dll вызов описан как fastcall
Цитата(ekianu @  25.4.2010,  15:11 Найти цитируемый пост)
function DLLFunc(var s: PChar): Boolean;

а в exe - stdcall.
Цитата(ekianu @  25.4.2010,  15:11 Найти цитируемый пост)

// EXE side
// usedll.dpr
function DLLFunc(var s: PChar): Boolean; stdcall; external 'mydll.dll';

Нужно привести к единому знаменателю.

Это сообщение отредактировал(а) kami - 25.4.2010, 21:55
PM MAIL WWW   Вверх
CodeMonkey
Дата 26.4.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89





--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.