Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.19;
Скачать: CL | DM;

Вниз

Работа с DLL   Найти похожие ветки 

 
Andre V.   (2002-09-04 09:55) [0]

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

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


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

А описание X ?


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

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

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


 
MBo ©   (2002-09-04 10:15) [3]

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


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

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


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

x = procedure( Index : Integer ); stdcall;


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

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


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

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


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

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


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

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


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

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


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


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

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


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

Так оно и есть.
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;


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

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


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

ДА!
Ведь это просто пример.
На самом деле в зависимости от значения 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;


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

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


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


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

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


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

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


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


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

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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.09.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
3-60932
sega
2002-08-30 12:37
2002.09.19
Лицензия к InterBase


4-61355
Mihail
2002-07-29 16:10
2002.09.19
SYSTRAY & POPUP


1-61169
dim-
2002-09-07 16:20
2002.09.19
Получить все значения ключа реестра


3-60993
Извращенец2
2002-08-29 14:19
2002.09.19
Работа с DBGrid


7-61336
DaLiV
2002-07-01 21:50
2002.09.19
rs422 ili rs485 komponent trebujets a