Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.048 c