Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 используется ? Раз уж строковый параметр передается ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо