Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
1-61168
vlv
2002-09-07 12:57
2002.09.19
Как в TMemo отловить перемещение курсора?


3-61011
wed
2002-08-29 10:48
2002.09.19
Запрос: вывести одинаковые значения поля


8-61221
VID
2002-05-19 19:58
2002.09.19
Нужно:


1-61082
SeregaS
2002-09-07 01:33
2002.09.19
Доступ к файлу - read access only


14-61249
vJet
2002-08-23 01:37
2002.09.19
Телефонный справочник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский