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

Вниз

Параметр функции из 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.016 c
14-68441
Nucl
2003-08-06 14:19
2003.08.21
DevExpress или TMS Components


1-68315
~Dim~
2003-08-06 14:31
2003.08.21
Как програмно показать hint компонента TEdit


3-68199
Flint
2003-07-28 13:27
2003.08.21
Изменение таблицы в Interbase


1-68388
han
2003-08-07 17:42
2003.08.21
out proccess com


1-68289
Micah'GF
2003-08-06 16:57
2003.08.21
Избавиться от мигания TImage