Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1136
vopros
2002-05-27 10:03
2002.07.01
Осмотр женщин выявил следующие результаты


14-1167
McSimm
2002-05-30 14:22
2002.07.01
Схожу с ума?


1-1017
AFROLOV
2002-06-18 10:34
2002.07.01
Ошибка при закрытии программы


1-1022
id_privin
2002-06-18 12:22
2002.07.01
Clock


14-1161
Anatoly Podgoretsky
2002-05-29 21:04
2002.07.01
Книга по BASM





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский