Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.01;
Скачать: CL | DM;

Вниз

TBitMap - в dll   Найти похожие ветки 

 
d_oleg ©   (2002-06-18 10:45) [0]

подскажите пожалуйста, как передать объект типа TBitMap в dll? Я передаю указатель на структуру, которую упрощённо можно предстаить как
TType = record
Description: ShortString;
Pic: TBitMap
end;
после чего при обращении к Pic выдаётся ошибка Not valid BitMap.


 
Skier ©   (2002-06-18 11:52) [1]

> d_oleg

Можно так :

TType = record
Description: PChar;
Pic: Pointer;
end;
PType = ^TType

var
AType : PType;
............
begin
..........
AType := AllocMem(SizeOf(TType));
AType^.Description := PChar("PictureName");
AType^.Pic := //создаёшь битмап
PassBitMap(AType); //PassBitMap процедура из DLL
...............//прибиваешь битмап
FreeMem(AType, SizeOf(TType));
..........
end;

в DLL объявляешь - PassBitMap(APicPtr : Pointer); ............;
в PassBitMap кастишь APicPtr на PType и вытаскиваешь битмап


 
d_oleg ©   (2002-06-18 12:26) [2]

Ну так приблизительно так и делаю. И говорят мне, что не битмэп это вообще.


 
Skier ©   (2002-06-18 12:35) [3]

> d_oleg
Покажи вызов твоего аналога PassBitMap
и покажи как ты работаешь с записью в теле PassBitMap.
В общем нужно немного твоего кода, чтобы поговорить
более предметно.


 
d_oleg ©   (2002-06-18 12:55) [4]

Вот такой тип:
TExtDll = record
DllName: ShortString;
Caption: ShortString;
Hint: ShortString;
Icon: TBitMap;
end;
TExtDlls = record
ExtDll: TExtDll;
NextDll: Pointer;
end;
pExtDlls = ^TExtDlls;

var
ExtDlls: pExtDlls;

Передаю указатель в dll, далее в dll обращаюсь к ExtDlls^.ExtDll.Icon - получаю по морде


 
Skier ©   (2002-06-18 13:17) [5]

перепиши вот так :

TExtDll = packed record
DllName: PChar;
Caption: PChar;
Hint: PChar;
Icon: Pointer;
end; //TExtDll
PExtDll = ^TExtDll;

TExtDlls = packed record
ExtDll: Pointer;
NextDll: Pointer;
end;
PExtDlls = ^TExtDlls;

var
ExtDlls: PExtDlls;

в своей DLL снова объяви записи TExtDlls, TExtDll и указатели
на них PExtDlls = ^TExtDlls, PExtDll = ^TExtDll

при вызове DLL-процедуры делаешь так

var
AExtDll : PExtDll;
AExtDlls: PExtDlls;
begin
AExtDll := AllocMem(SizeOf(TExtDll));
AExtDlls := AllocMem(SizeOf(TExtDlls));
AExtDll^.Icon := TBitmap.Create;
AExtDlls^.ExtDll := AExtDll;
//далее заполняешь структуры по своему усмотрению
// вызываешь свою DLL-процедуру
//освобождаешь TBitmap
//освобождаешь AExtDll и AExtDlls
end;


DLL-процедура

PassBitmap(APicPtr : Pointer); stdcall;
begin
if APicPtr = nil then Exit;
with PExtDlls(APicPtr)^ do begin
if ExtDll = nil then Exit;
with PExtDll(ExtDll)^ do begin
if Icon = nil then Exit;
with TBitmap(Icon) do begin
//сюда помещаешь код обработки Icon
end; //with
end; //with
end; //with
end;


И совет на будущее : при передаче строк в DLL пользуйся PChar !



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.009 c
8-1108
PEC
2002-02-25 12:51
2002.07.01
Delphix


4-1251
Nimbus
2002-04-30 23:08
2002.07.01
Диалоговое окно


1-1006
Dennn_is
2002-06-18 08:49
2002.07.01
КАК?


1-1029
Looser
2002-06-17 23:39
2002.07.01
Как можно реализовать задержку в выполнении программы?


4-1241
Alexander
2002-05-02 14:57
2002.07.01
А как, по ID или Handle изменить шрифт у StaticText?