Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с DLL [D5, Win95/98, NT4]


Andre V. ©   (2002-09-04 09:55:00) 

Такая фигня:
procedure SetNumber( Index : Integer ); stdcall;
....
в DLL....

и динамическая загрузка в программе
@X := GetProc...( Handle, "SetNumber" );
вызываю X( 0 ), а в самой процедуре получаю 12897657
Так со всеми типами, включая просто Var DATA,
кроме Boolean и PChar. Эти два передаются корректно...
Если кто сталкивался, может подскажет?
Опции там разные, ключики или еще что...


Andre V.   (2002-09-10 10:23:00) [1]

Уважаемый Н... С.!
Если я пишу в DLL и EXE -> Var DATA, то значение DATA не изменяется. А если пишу P := @DATA и P : Pointer, то изменения
для DATA выполняются нормально


Набережных С.   (2002-09-05 14:26:00) [2]


> Andre V. (05.09.02 12:34)
> Значение переменной при этом не изменяется.

Значи, что-то еще неправильно делаешь. Покажи свой РЕАЛЬНЫЙ код в DLL и EXE.

> Чтобы его изменить в основной программе, требуется
> передавать указатель на переменную.

Var и обеспечивает передачу указателя("передача по ссылке").


Andre V.   (2002-09-05 12:34:00) [3]

Значение переменной при этом не изменяется.
Чтобы его изменить в основной программе, требуется
передавать указатель на переменную.


Набережных С.   (2002-09-04 16:38:00) [4]


> Отладчик в DLL на попытку рассмотреть это
> самое DATA ругается <no value>

Отладчик ругается потому, что не знает типа переменной, на которую указывает параметр. А передавать так-же как в любую функцию. Как у тебя и написано:)


Andre V.   (2002-09-04 14:01:00) [5]

Кто, что подскажет про передачу в функцию из DLL параметра
типа VAR.


Andre V.   (2002-09-04 13:10:00) [6]

ДА!
Ведь это просто пример.
На самом деле в зависимости от значения Count
предполагается, что структура DATA заполняется различными
значениями.
Для понятности вызывается из DLL диалог с 15 страничками,
каждой соответствует свой набор полей.
Type
page1 = Record
....
end;
page2 = Record
....
end;
page3 = Record
....
end;
begin
case Count of
1: with page1(DATA) do
begin
....
end;
....
end;


MBo   (2002-09-04 13:05:00) [7]

Подозреваю, что у тебя некоторые перманентные проблемы с правильным объявлением типов.
procedure FillArray( Count : Integer; Var DATA ); stdcall;
Data здесь - нетипизированный указатель. Так и надо?


Andre V.   (2002-09-04 13:02:00) [8]

Так оно и есть.
procedure FillArray( Count : Integer; Var DATA ); stdcall;
...
АНАЛОГИЧНО...

сама процедура
begin
FillChar( DATA, Count, <ЗНАЧЕНИЕ> );
end;

В основной программе как была в массиве DATA всякая фигня,
так и осталась. Отладчик в DLL на попытку рассмотреть это
самое DATA ругается <no value>

P.S. Ессественно, массив объявлен
Var
DATA : Array[0..Max] of Byte;


Виктор Щербаков   (2002-09-04 12:57:00) [9]


> А если параметр типа Var или Record?

Главное, чтобы описание передаваемого типа Record в dll и хост-приложении, были идентичными.


MBo   (2002-09-04 12:55:00) [10]

это ничем не отличается - и в библиотеке, и в программе объявление должно быть с Var


Ученик   (2002-09-04 12:55:00) [11]

Как обычно, главное чтобы string-ов не было


Andre V.   (2002-09-04 12:54:00) [12]

Так чо? Как передать переменную в процедуру динамической библиотеке?


Andre V.   (2002-09-04 12:34:00) [13]

Дополнительно...
А если параметр типа Var или Record?
У меня программа не понимает.
Может быть надо вместо Var NameStructure передавать
@NameStructure...


Andre V.   (2002-09-04 10:20:00) [14]

СПАСИБО! Поробую....


Ученик   (2002-09-04 10:18:00) [15]

x = procedure( Index : Integer ); stdcall;


Andre V.   (2002-09-04 10:17:00) [16]

Где именно. В описании типа?


MBo   (2002-09-04 10:15:00) [17]

здесь же тоже stdcall надо непременно


Andre V.   (2002-09-04 10:13:00) [18]

Type
x = procedure( Index : Integer );
пробовал также (есссественно менял в обеих местах...)

Index : Byte вход 0 выход 128
Index : Word вход 0 выход 43265


Ученик   (2002-09-04 09:57:00) [19]

А описание X ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо