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