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

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

TBitMap - в dll


d_oleg ©   (2002-06-18 10:45:00) 

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


Skier   (2002-06-18 13:17:00) [1]

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

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 !


d_oleg   (2002-06-18 12:55:00) [2]

Вот такой тип:
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 12:35:00) [3]

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


d_oleg   (2002-06-18 12:26:00) [4]

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


Skier   (2002-06-18 11:52:00) [5]

> 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 и вытаскиваешь битмап


Наверх

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