Форум: "Основная";
Текущий архив: 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