![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL и Device Context [D7, WinXP]
PenguinX © (2004-06-15 11:22:00)Всем привет!
Почему при вызове из 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 - пустой. Если поместить эту ф-ию в модуль вместе с прогой, то всё работает. В чём дело?
GuAV (2004-06-15 15:50:00) [1]
> ??????????????????????????????????????????????
в этой ветке ответ :)
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1087202445&n=0
Игорь Шевченко (2004-06-15 15:37:00) [2]
> Совсем забыл, что HDC - всего лишь адрес в памяти
??????????????????????????????????????????????
PenguinX (2004-06-15 14:29:00) [3]Ой, торможу:-). Совсем забыл, что HDC - всего лишь адрес в памяти.
Всем ОГРОМНОЕ спасибо!!!
Clickmaker (2004-06-15 14:05:00) [4]
> Result := BM.hDC;
> BM.Destroy;
Не понял смысла этих строчек. Если тебе нужен контекст BM, зачем ты его сразу же убиваешь?
Гаврила (2004-06-15 14:04:00) [5]Ты разрушил BM после передачи контекста наружу
PenguinX (2004-06-15 14:01:00) [6]UP
PenguinX (2004-06-15 13:24:00) [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;
...
---------------
В принципе всё очень просто, ИМХО у меня нет грубых ошибок, которые могли бы привести к такому результату.
Игорь Шевченко (2004-06-15 13:06:00) [8]
> Ничего не говорит.
Так не бывает. Отладчик должен показывать возвращаемое значение функции непосредственно перед возвратом
PenguinX (2004-06-15 12:38:00) [9]Ничего не говорит.
Игорь Шевченко (2004-06-15 12:03:00) [10]Что говорит отладчик ?
PenguinX (2004-06-15 11:50:00) [11]Помогите!
PenguinX (2004-06-15 11:39:00) [12]Я пробовал MessageBox из DLL делать с этим строковым параметром - отображается!
Гаврила (2004-06-15 11:30:00) [13]А ShareMem используется ? Раз уж строковый параметр передается ?