Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: 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 вся ветка

Текущий архив: 2004.06.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
4-1084866854
lehich
2004-05-18 11:54
2004.06.27
имя пользователя


3-1086042763
OBA
2004-06-01 02:32
2004.06.27
Удаление табл. в Interbase/Firebird


14-1086896329
YurikGL
2004-06-10 23:38
2004.06.27
Оштрафовали создателя сайта за гиперссылку на 25 $


1-1086799141
Mike
2004-06-09 20:39
2004.06.27
строки


1-1087106317
Дэвид
2004-06-13 09:58
2004.06.27
If ...Then принадлежность к промежутку