Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
ВнизРабота с 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c