Вниз
Скачать: CL | DM;

DLL и Device Context   Найти похожие ветки 

← →
PenguinX ©   (2004-06-15 11:22) [0]

Всем привет!
Почему при вызове из DLL ф-ии, возвращающей значение типа HDC, в вызывающем приложении приложении HDC = 0?
Например:
----dll----
...
function SomeFunc(A: string): HDC;
begin
... // Здесь пр-ся операции над результатом, по окончании он на 100% не равен нулю и содержит довольно обширное изображение.
end;

exports SomeFunc;
...
------------
-----app----
...
function SomeFunc(A: string): HDC; external "mydll.dll";

procedure Form1.Button1Click(Sender: TObject);
begin
Image1.Canvas.Handle := SomeFunc(Edit1.Text);
end;
...
------------
После вызова Image1 - пустой. Если поместить эту ф-ию в модуль вместе с прогой, то всё работает. В чём дело?


← →
Гаврила ©   (2004-06-15 11:30) [1]

А ShareMem используется ? Раз уж строковый параметр передается ?


← →
PenguinX ©   (2004-06-15 11:39) [2]

Я пробовал MessageBox из DLL делать с этим строковым параметром - отображается!


← →
PenguinX ©   (2004-06-15 11:50) [3]

Помогите!


← →
Игорь Шевченко ©   (2004-06-15 12:03) [4]

Что говорит отладчик ?


← →
PenguinX ©   (2004-06-15 12:38) [5]

Ничего не говорит.


← →
Игорь Шевченко ©   (2004-06-15 13:06) [6]


> Ничего не говорит.


Так не бывает. Отладчик должен показывать возвращаемое значение функции непосредственно перед возвратом


← →
PenguinX ©   (2004-06-15 13:24) [7]

Здесь что-то левое творится.
До присваивания - один HDC(само собой:)), после присваивания - другой, но не равный нулю. А Image при этом остаётся пустым.
Мастера, кому не в лом, попробуйте следующее: подключить в юзес к пректу DLL модуль FastDIB(никакого плагиата, авторы будут указаны в ReadMe) и вставить следуюший код:
------dll-------
...
var BM: TFastDIB;

function LoadBMP(FileName: string): HDC;
begin
BM := TFastDIB.Create;
BM.LoadFromFile(FileName);
Result := BM.hDC;
BM.Destroy;
end;

exports LoadBMP;
...
---------------
а затем вызвать из приложения, например так:
------app-------
...
function LoadBMP(FileName: string): HDC; external "mydll.dll";

procedure Button1.Click(Sender: TObject);
begin
Image1.Canvas.Handle := LoadBMP(Edit1.Text);
end;
...
---------------
В принципе всё очень просто, ИМХО у меня нет грубых ошибок, которые могли бы привести к такому результату.


← →
PenguinX ©   (2004-06-15 14:01) [8]

UP


← →
Гаврила ©   (2004-06-15 14:04) [9]

Ты разрушил BM после передачи контекста наружу


← →
Clickmaker ©   (2004-06-15 14:05) [10]


> Result := BM.hDC;
> BM.Destroy;

Не понял смысла этих строчек. Если тебе нужен контекст BM, зачем ты его сразу же убиваешь?


← →
PenguinX ©   (2004-06-15 14:29) [11]

Ой, торможу:-). Совсем забыл, что HDC - всего лишь адрес в памяти.
Всем ОГРОМНОЕ спасибо!!!


← →
Игорь Шевченко ©   (2004-06-15 15:37) [12]


> Совсем забыл, что HDC - всего лишь адрес в памяти


??????????????????????????????????????????????


← →
GuAV ©   (2004-06-15 15:50) [13]


> ??????????????????????????????????????????????

в этой ветке ответ :)
http://delphimaster.net/view/1-1087202445/



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.021 c
1-1086980832
connect
2004-06-11 23:07
2004.06.27
Как в Delphi произвести автоформатирование кода


6-1083623695
Eugene13
2004-05-04 02:34
2004.06.27
База видео фильмов в инете...


14-1086858146
Verg
2004-06-10 13:02
2004.06.27
Странное мышление


14-1086590122
John69
2004-06-07 10:35
2004.06.27
как восстановить файл *.pas


6-1083794068
saNat
2004-05-06 01:54
2004.06.27
Outlook Express




   Наверх