Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2009, 12:00   #1
Adamrus
Пользователь
 
Аватар для Adamrus
 
Регистрация: 26.11.2009
Сообщений: 59
Печаль Передача StringGrid в DLL

Здравствуйте.
Есть вопрос.
создал dll, в которую передаю объект StringGrid.

прототип в программе:
Код:
procedure Init(StringGrid1: TStringGrid); export; external 'dll.dll';
вызов в программе:
Код:
Init(StringGrid1);
Содержание dll:
Код:
library dll;
uses
  SysUtils,
  Grids;
{$R *.res}
procedure Init(sg1: TStringGrid);
begin
sg1.Cells[1,1]:=StrPas('?');
end;
exports Init;
end.
в ячейку (1,1) заносится '?', а при закрытии приложения вылетает ошибка
Invali Pointer Operathion

при передачи, к примеру, Memo, и в dll применят метод add к строкам все в порядке при закрытии.

Последний раз редактировалось Stilet; 26.11.2009 в 12:26.
Adamrus вне форума Ответить с цитированием
Старый 26.11.2009, 12:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попробуй procedure Init(var sg1: TStringGrid);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2009, 19:16   #3
Adamrus
Пользователь
 
Аватар для Adamrus
 
Регистрация: 26.11.2009
Сообщений: 59
По умолчанию

я пробовал по ссылке =(

Но, что интересно, в новом приложении с подключением функции из такой же dll все работает, а когда добавляю в свою прогу, пишу транслятор, вылетает ошибка при закрытии. Комментирую вызов, все в порядке )
Adamrus вне форума Ответить с цитированием
Старый 26.11.2009, 19:59   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Объекты всегда передаются по ссылке, даже если это явно не указано.

А по поводу ошибки, погугли Invalid Pointer Operathion.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 27.11.2009, 22:17   #5
Adamrus
Пользователь
 
Аватар для Adamrus
 
Регистрация: 26.11.2009
Сообщений: 59
Печаль

погуглил.
к сожалению, кроме размытых ответов ни чего не нашел.
Единственное - это то, что со строками в dll нужно осторожнее работать.
свойство cells не принимает PChar, да и строки из dll в прогу я передаю явно не больше 255 символов.
не пойму почему в Memo они уходят нормально, а StringGrid нет...
Adamrus вне форума Ответить с цитированием
Старый 27.11.2009, 23:03   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А где у вас точка выхода из DLL?
Попробуйте добавить (для гарантированной выгрузки длль-ки):
Код:
library dll; //ну что за название - "dll"? Назовите хоть MyDLL...
uses
  SysUtils,
  Grids;
//{$R *.res} какие у вас тут ресурсы?!
{$E dll}

var
   MyExit: Pointer;     //точка выхода из DLL

procedure Init(sg1: TStringGrid);
begin
sg1.Cells[1,1]:=StrPas('?');
end;

procedure LibExit;
begin
ExitProc:=MyExit;
end;

exports Init;

begin
ExitProc:=@LibExit;
MyExit:=ExitProc;
LibExit; //это вроде необязательно
end;
end.

Последний раз редактировалось mihali4; 27.11.2009 в 23:09.
mihali4 вне форума Ответить с цитированием
Старый 28.11.2009, 07:51   #7
Adamrus
Пользователь
 
Аватар для Adamrus
 
Регистрация: 26.11.2009
Сообщений: 59
По умолчанию

Попробовал так:
Код:
library dll;

uses
  Grids;

{$E dll}
var
   MyExit: Pointer;
   ch: char;

procedure Init(sg1: TStringGrid);
begin
  ch:='1';
  sg1.Cells[1,1]:=ch;
end;

procedure LibExit;
begin
  ExitProc:=MyExit;
end;
exports Init;

begin

  ExitProc:=@LibExit;
  MyExit:=ExitProc;
  LibExit;
// end; здесь не понял зачем end
end.
при вызове в основной программе все также
Init(StringGrid1);

при выходе все равно ошибка.

Последний раз редактировалось mihali4; 07.12.2009 в 15:10.
Adamrus вне форума Ответить с цитированием
Старый 30.11.2009, 21:46   #8
Adamrus
Пользователь
 
Аватар для Adamrus
 
Регистрация: 26.11.2009
Сообщений: 59
Печаль

Я понимаю, что ошибка при выгрузке библиотеки, конкретно, при уничтожении указателя на нее, но вот незадача, стоит туда (в библиотечную процедуру) подавать только Memo, все в порядке, а при подаче туда StringGrid, на выходе из программы ошибка.
Отзовитесь.
Пишу транслятор с Qbasic, не охото инициализацию таблицы с ключевыми словами, разделителями и т.п. запихивать в основной код программы...
Adamrus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача фрейма из dll BESS Компоненты Delphi 1 20.04.2009 18:54
Передача данных из VC++ DLL в Delphi App Kosoglaz Общие вопросы C/C++ 2 05.02.2008 10:53
Передача сообщения из программы в свою Dll SergeySK Общие вопросы Delphi 3 01.11.2007 14:42
Передача данных(массива) через DLL. acorables Общие вопросы Delphi 4 05.02.2007 13:16
передача объектов как параметров функций в Dll Umen Общие вопросы Delphi 9 12.11.2006 19:31