![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с 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 ?