Главная страница
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.029 c
1-1086887027
nester
2004-06-10 21:03
2004.06.27
Как зашифровать exe-шник и расшифровать его на лету.


10-1013693872
GenBr
2002-02-14 16:37
2004.06.27
Как узнать имя компьютера?


4-1085080686
killer
2004-05-20 23:18
2004.06.27
Вид папок в Windows


3-1086182785
Lego
2004-06-02 17:26
2004.06.27
проблема с именем таблицы...


8-1082016581
sachem
2004-04-15 12:09
2004.06.27
Как в компаненте медиаплеер развернуть видео на весь экран?