Главная страница
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.01 c
3-902
VAleksey
2002-06-07 15:58
2002.07.01
параметры в ТUpdateSQL


1-941
billybons
2002-06-19 09:43
2002.07.01
помогите плз - прога убиваться не хочет


14-1190
Snap
2002-05-28 14:03
2002.07.01
СРОЧНО НУЖДАЮСЬ В ПОМОЩИ!!!!!!!!!!!!!!!!!!


3-859
ORFO
2002-06-06 11:36
2002.07.01
Как сохранить результат фильтра таблицы в файл?


8-1113
ZedZed
2002-02-19 19:13
2002.07.01
Аудио шкала!