Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];

Вниз

Параметр функции из DLL   Найти похожие ветки 

 
Still Swamp   (2003-08-08 10:21) [0]

Есть родительское приложение в котором описано следующее:

type
TRGBA=Record
R,G,B,A:single;
end;

type
TChangeColor = function (RGBA:TRGBA):integer of Object;

MyObject=class
function AChangeColor(RGBA:TRGBA):integer;
end;

var
VChangeColor: TChangeColor;

begin
VChangeColor:=AChangeColor;
Вызов DLL с параметром @VChangeColor
end;


Есть DLL в которую я передаю этот самый @VChangeColor и пытаюсь из DLL вызвать функцию AChangeColor с параметром RGBA:TRGBA. Функция вызывается, однако в параметре возвращается фигня какая-то. Плс, подскажите что может это быть?

это вызов из DLL
if @ChangeColor<>nil then ChangeColor(RGBA);


 
sts   (2003-08-08 10:31) [1]

uses ShareMem


 
sts   (2003-08-08 10:35) [2]

нет (предыдущее сообщение - не подумав)
Нужен код вызова и код в DLL
Кстати, лучше сделать TRGBA = packed record




 
Still Swamp   (2003-08-08 10:36) [3]

а что это?
из хелпа я понял, что это какой-то менеджер памяти подгружаемый из борландовской длл, который замещает стандартный.

а это хорошо или плохо?


 
Still Swamp   (2003-08-08 10:42) [4]

тогда что такое packed record

ChangeColor:Pointer - это адрес той самой функции с которой я не могу получить параметры

function SetRGBA;
var
H: Cardinal;
SetRGBA:function (RGBA:TRGBA; CaptionDialog:ShortString; ChangeColor:Pointer): integer; stdcall;
DLLName:string;
begin
DLLName:="rgba.dll";
H:= LoadLibrary(PChar(DllName));
if H <=0 then begin
Result:=0;
end else begin
@SetRGBA := GetProcAddress(H, PChar("SetRGBA"));
if @SetRGBA=nil then begin
Result:=0;
end else begin
( ARGBA, ACaptionDialog, AChangeColor)
тогда что такое packed record

ChangeColor:Pointer - это адрес той самой функции с которой я не могу получить параметры

function SetRGBA;
var
H: Cardinal;
SetRGBA:function (RGBA:TRGBA; CaptionDialog:ShortString; ChangeColor:Pointer): integer; stdcall;
DLLName:string;
begin
DLLName:="rgba.dll";
H:= LoadLibrary(PChar(DllName));
if H <=0 then begin
Result:=0;
end else begin
@SetRGBA := GetProcAddress(H, PChar("SetRGBA"));
if @SetRGBA=nil then begin
Result:=0;
end else begin
Result:=SetRGBA(ARGBA, ACaptionDialog, AChangeColor);
end;
end;
end;


 
Семен Сорокин   (2003-08-08 10:44) [5]

http://www.delphimaster.ru/articles/book/Chap09.pdf


 
Digitman   (2003-08-08 10:49) [6]


> Still Swamp


упоминание о DLL - опять к слову ?) ну ни при чем здесь DLL ! вообще ни при чем !) ведь структура TRGBA - не динамического типа)..

type

PRGBA = ^TRGBA;
TRGBA=packed Record
R,G,B,A:single;
end;

function AChangeColor(RGBA:PRGBA):integer;
begin
RGBA.R := ...;
...
end;

var
MyRGBA: TRGBA;
...

MyResult := AChangeColor(PRGBA(@MyRGBA));


 
Palladin   (2003-08-08 10:51) [7]

почему у тебя название фукнции с идентификатором совпадает?
не боялся когда писал?
а библиотеку загруженую освобождать не надо?


 
sts   (2003-08-08 10:59) [8]

и почему метод передается в Pointer ?


 
Still Swamp   (2003-08-08 11:02) [9]

Паладину

название функции с идентификатором - каие конкретно ты имеешь в виду? может действительно в этом косяк?

библиотека бусть сама выгружается когда софтину закрыли.... это ее проблемы.


 
Still Swamp   (2003-08-08 11:07) [10]

sts"у
а куда его передавать?


 
Palladin   (2003-08-08 11:12) [11]


> Still Swamp (08.08.03 11:07)

ты обрати внимание на Digitman © (08.08.03 10:49), или ты в упор не воспринимаешь приведенный им код?


 
Still Swamp   (2003-08-08 11:19) [12]

я буду биться скоро головой о стену.
1

PRGBA = ^TRGBA;
RGBA:PRGBA;
RGBA.R := ...; - у меня не компилируется!

2
Это конечно вопрос уже из другой области, но я не могу осмыслить что такое PRGBA = ^TRGBA. Возможно из за этого гед то делаю ошибку.

если есть возможность - поясни плс.

i:integer - это переменная возвращающая значение, хранящееся в памяти

@i - это возвращает адрес начала значения - это я могу осмыслить.

что такое i^ или ^i?



 
sts   (2003-08-08 11:30) [13]

Надо начать с языка, потом переходить к dll и иже с ними.
Методы объекта имеют размер 8 байт (см. TMethod)


 
Palladin   (2003-08-08 11:32) [14]


> RGBA.R := ...; - у меня не компилируется!

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


 
Still_Swamp   (2003-08-08 11:41) [15]

ок


 
Still_Swamp   (2003-08-08 11:55) [16]

Ладно - бог с ними с этими указателями.
Подскажите, как описать свое сообщение? WM_...


 
Digitman   (2003-08-08 11:57) [17]


> RGBA.R := ...; - у меня не компилируется!


ну правильно !) точечки вот эти ... компилятору непонятны)


> не могу осмыслить что такое PRGBA = ^TRGBA.


это - объявление указательного типа для последующих ссылок на него
тем самым ты говоришь компилятору : отныне везде, где встретится что-либо, имеющее тип PRGBA, это следует интерпретировать как указатель на данные (адрес начала данных) в памяти, которые имеют тип TRGBA.


> i:integer - это переменная возвращающая значение, хранящееся
> в памяти


i - это просто переменная, которую ты объявилю. Ничего она пока не возвращает, она предназначена для хранения в памяти данных, тип которых (по твоему указанию) компилятору следует по умолчанию интерпретировать как integer


> @i - это возвращает адрес начала значения - это я могу осмыслить.


истину глаголишь)... добавлю лишь что на то, как в дальнейшем компилятор будет интерпретировать этот самый адрес (как он будет реагировать на попытку передачи этого адреса куда-то дальше по текту программы), влияет опция компилятора "Typed @ operator". Проверь, в каком состоянии у тебя эта опция для данного проекта.


> что такое i^ или ^i?


в дан. случае конструкция i^ бессмысленна, поэтому компилятор ее не пропустит.
этой конструкцией (называется она "разыменование указательной переменной") ты пытаешься заставить компилятор сгенерировать код, который в ран-тайм должен взять значение указателя (значение адреса чего-то), лежащего в i, и по этому адресу взять лежащее там значение. Но i - это не указатель ! Ты же сам сказал компилятору, что в i ты собираешься хранить просто некие целочисленные значения ! Компилятор, видя несуразицу, предупредит тебя о возможной твоей ошибке в объявлениях типов.

А вот если ты напишешь так :

var
i: Integer;
..
i := 100;
PInteger(i)^ := 5;

то компилятор ругаться не будет, ибо ты указал ему явно, что хочешь в ран-тайм интерпретировать значение переменной i как указатель на область памяти, имеющей нач.адрес 100, куда следует записать целочисленное значение, равное 5.

Конструкция ^i недопустима, потому что i - это не идентификатор типа, а идентификатор переменной. Правильной будет запись вида ^Integer. Она предписывает компилятору определить для дальнейшего использования и проверок некий новый указательный тип, являющийся указательным типом данных в формате Integer.

Пример :

type
PMyTypeOfIntPointers = ^Integer;

var
i, k: Integer;
pi: PMyTypeOfIntPointers; // равносильно pi: ^Integer

...
i:= 5;
j := 0;
pi := @i; // запись в переменную зш указателя на переменную i
k := pi^; //чтение значения по адресу, лежащему в pi (это адрес переменной i, там лежит сейчас 5)
// теперь в k будет тоже лежать 5-ка !


 
Still_Swamp   (2003-08-08 12:11) [18]

оки - сенкс.
кто из вас администратор delphimaster?


 
Still_Swamp   (2003-08-08 12:15) [19]

Typed @ operator - выключен


 
Digitman   (2003-08-08 12:16) [20]


> Still_Swamp


походил бы ты в "Школу Ю.Зотова" что ли ... )
ведь в такие дебри полез, а азов неймешь)

и на кой шут тебе
> администратор delphimaster
- тоже непонятно


 
Still_Swamp   (2003-08-08 12:21) [21]

как тебе сказать - успехи свои дельфиписательские мне расскзывать бессмысленно. всего знать нельзя, поэтому я когда сталкиваюсь с чем-то начинаю разбираться - ни разу не было, что бы я не сделал того, что мне понадобилось. раньше не было нужно. сейчас столкнулся... через 3 дня максимум сделаю. с помощью или без не имеет значения.

администратор - кто то из вас.
мало вероятно что кому то постороннему понадобится меня регистрить столь изощренным методом. вот я и заинтересовался кто.


 
Digitman   (2003-08-08 12:38) [22]


> Still_Swamp



> администратор - кто то из вас


чур не я)

p.s.
а в школу все ж походи ! ничего зазорного нет.
там преподаются не азы Делфи и даже не азы Паскаля


 
Still_Swamp   (2003-08-08 12:41) [23]

я бы "походил".... и речь не про зазорное.... но вот со временем плохо.



 
Still_Swamp   (2003-08-08 13:09) [24]

в общем и целом все оказалось на редкость просто.
TProcSetColor=function (RGBA:TRGBA):integer;

в модуле я описываю
Myobject=Tobject;
function ProcSetColor (RGBA:TRGBA):integer;
end;

передаю я в длл ProcSetColor:TProcSetColor;

в длл описана Temp:TProcSetColor;
Далее Temp:=ProcSetColor;

просто этот Temp исполняю.... никаких ^!.... разбирательство с ними отложено до следующего случая. :)


 
Still_Swamp   (2003-08-08 13:09) [25]

... а вы "цапу крути"... :)


 
Palladin   (2003-08-08 13:26) [26]

skier сильно не смейся :))


 
sts   (2003-08-08 13:31) [27]

2 Still_Swamp © (08.08.03 13:09)
a это зачем ?

>в модуле я описываю
>Myobject=Tobject;
>function ProcSetColor (RGBA:TRGBA):integer;
>end;



 
Digitman   (2003-08-08 13:38) [28]


> Still_Swamp


цапу-то ты крутишь) ... а не мы)

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


 
Still_Swamp   (2003-08-08 13:38) [29]

ну ээээ, я иначе не придумал как само тело этой функции написать.


 
Digitman   (2003-08-08 13:42) [30]

ну что ты будешь делать , а ?)

ну вот же ! уже готовый шаблон я тебе привел же


> Digitman © (08.08.03 10:49)


на кой черт ты классы да методы какие-то вводишь, усложняя примитивнейшую задачу передачи параметра по ссылке - ума не приложу)


 
Still_Swamp   (2003-08-08 13:46) [31]

ну извини - не понял. длл сыграла свою паршивую роль в том, что когда я просто вызвал некую функцию - по ее указателю в пределах одного юнита - никакой фигни с record не произошло. перед тем как все мостить в длл я проверил. все прекрасно передалось.

вынес в длл - начались приключения. см первую мессагу.


 
Digitman   (2003-08-08 13:54) [32]


> Still_Swamp


покажи-ка, как ты реализовал передачу параметра без DLL...


 
Still_Swamp   (2003-08-08 13:57) [33]

да потому что у меня есть объект интерфейсный TAppObj, который знает все про приложение приложение состоит ну чуть менее чем из 200 длл писанных несколькими людьми. через него крайне удобно обращаться к довольно громоздким конструкциям, писаным не только мной. когда я решаю что какая-то часть из обработок заслуживает своего длл - я ее выношу отдельно.

у этого APP много свойств и медотов, в том числе специфичный для каждой DLL TDataobj описанный в самй DLL. вот про него то ты и спрашиваешь, на кой я все усложняю. а извини, мне нужно сделать что бы оно не на одной формочке работало, а все вместе.


 
Digitman   (2003-08-08 14:23) [34]


> Still_Swamp



> приложение состоит ну чуть менее чем из 200 длл


Делфи-приложение состоит всегда из одного Делфи-проекта, в ходе компиляции/сборки которого создается один единственный exe-файл. Все прочие DLL, от которых зависит работа этого приложения, являются самостоятельными проектами, возможно объединенными в группу проектов, но не являющимися самостоятельными приложениями с т.з. системной концепции как таковой.

К чему ты про свой TAppObj здесь рассказываешь - мне непонятно.
Механика вызова ЛЮБЫХ подпрограмм с параметрами, передаваемыми по ссылке, едина для любой реализации подпрограммы, будь она физически реализована в DLL или в том же EXE, который ее вызывает.


 
Still_Swamp   (2003-08-08 14:24) [35]

уже нема.


 
Still_Swamp   (2003-08-08 14:27) [36]

я ответил тебе на вопрос, зачем напридумывал всякие MyClass и почему усложнилась примитивнейшая (для тебя) задача.


 
Digitman   (2003-08-08 14:43) [37]

охохооо !(

и кому я все это долдонил-то) ... одному богу известно))


в EXE:

type

PRGBA = ^TRGBA;
TRGBA = packed record
...
end;

TSetRGBA = function (RGBA:PRGBA;...): integer; stdcall;
...

var

ARGBA: TRGBA;
FuncSetRGBA: TSetRGBA;

function SetRGBA;
var
H: Cardinal;
DLLName:string;
begin
DLLName:="rgba.dll";
H:= LoadLibrary(PChar(DllName));
if H >= 32 then begin
Result:=0;
end else begin
@FuncSetRGBA := GetProcAddress(H, PChar("SetRGBA"));
if @FuncSetRGBA=nil then begin
Result:=0;
end else begin
Result:=FuncSetRGBA(@ARGBA, ...);
end;
end;
end;


в DLL:

function SetRGBA(RGBA:PRGBA;...): integer; stdcall; export;
begin
...
RGBA.R := ...;
...
end;


 
Serginio666   (2003-08-08 14:48) [38]


А нельзя использовать
function SetRGBA(Var RGBA:TRGBA;...): integer; stdcall; export;
begin
...
RGBA.R := ...;
...
end;

И соответственно вызов
Result:=FuncSetRGBA(ARGBA, ...);




 
Digitman   (2003-08-08 14:49) [39]

запарился уже)

if H <= 32 then begin
Result:=0;


 
Still_Swamp   (2003-08-08 14:52) [40]

да все уже... вроде бы. :)
сенкс.



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

Форум: "Основная";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.009 c
14-68534
MalkoLinge
2003-08-04 16:11
2003.08.21
Вечный вопрос №2


1-68301
still
2003-08-06 14:14
2003.08.21
Символы типа ^H, ^X и т.п.


3-68248
freemax
2003-07-25 14:49
2003.08.21
Как мне узнать в ДБГрид шырину определенной колонки??


14-68477
race1
2003-08-06 11:54
2003.08.21
Возможно ли это


4-68596
Alien
2003-06-18 17:26
2003.08.21
Как узнать Caption у TButton, TPanel, и т.д.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский