Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
ВнизКак импортировать тип данных из dll ??? Найти похожие ветки
← →
TAHAT (2003-11-10 08:50) [0]Доброго времени суток, уважаемые ! Есть проблема следующего характера. У меня есть dll, исходный код которой написан на ANSI C. В ней определены тип данных: Struct LPX {..} и несколько процедур для работы с ним, в которые переменная данного типа передается в качестве параметра. Мне нужно испоьзовать эти функции(просто позарез !!), однако я не могу создать переменную, передаваемую им в параметры, без определения ее типа. Как мне импортировать этот тип из dll ???
← →
Dimka Maslov (2003-11-10 09:17) [1]Тип нельзя импортировать. Тип - это абстракное объявление организации данных в памяти. Для работы с этим типом объяви соответствующую запись в Delphi, указатель на неё и работай себе наздоровье.
← →
TAHAT (2003-11-10 09:59) [2]Простите за глупый вопрос, конечно.... а если я не знаю, как этот тип устроен ????
← →
Reindeer Moss Eater (2003-11-10 10:04) [3]Как этот тип устроен - описано в файле *.h
← →
TAHAT (2003-11-10 10:19) [4]Ага... Описан... например вот так
struct ...
...
DMP *pool
...
И чему равен эквивалент этого DMP в Паскале ???
← →
Reindeer Moss Eater (2003-11-10 10:26) [5]Сначала найди базовый тип C для DMP.
Он должен быть описан выше
← →
Dimka Maslov (2003-11-10 10:27) [6]Посмотри как описан DMP в сях
← →
Reindeer Moss Eater (2003-11-10 10:30) [7]www.filesearch.ru + "c2pas.exe"
C:> c2pas.exe your_c_file.h
В результате получишь готовый (почти готовый) интерфейсный паскалевский модуль к DLL.
← →
TAHAT (2003-11-10 12:00) [8]Спасибо за ссылку...
А по поводу DMP - я два дня уже определение это типа по заголовочникам ищу, но их больше 20 и я уже задолбался.....
← →
KSergey (2003-11-10 12:55) [9]А может поиском просто попробовать? ;)
Или открыть проект с этими заголовочными файлами в сишной среде (ну накидать накрайняк 3 строчки сишные) - и перейти на определение, что сишные IDE умеют.
Если что- можетет написать, попробую помочь с нахождением определения.
← →
TAHAT (2003-11-10 13:08) [10]Спасибо за предложение помощи....
Вот тут мне еще насоветовали так поступать...
если поля структуры имею дурацкие типы и нет нужды присваивать им какое-либо значение явным образом (а у меня как раз такой случай), то в заменить в определении соответствующего структуре record"а все такие дурацкие типы на PChar... Кто-нить уже проделывал подобное ?
Это работает ?
← →
PVOzerski (2003-11-10 13:26) [11]>структуре record"а все такие дурацкие типы на PChar... Кто-нить уже проделывал подобное ?
В общем случае, так делать нельзя. Потому что поле "дурацкого типа" может иметь любую "дурацкую" SizeOf(), а не только SizeOf(pChar)=4. И если не угадаете, можете неверно интерпретировать (не по тому смещению прочитать/записать) содержимое "недурацких" полей, следующих далее. Равно как и выделить блок памяти неправильной длины при динамическом создании такой структуры. Так что лучше всё-таки разберитесь с этими полями по-честному, да и про опции выравнивания не забудьте.
← →
TAHAT (2003-11-10 14:26) [12]Вот про опции выравнивания - это для чего и в каких случаях ???
И вообще, какие ньюансы нужно учитывать, при переопределения такого типа ???
← →
Reindeer Moss Eater (2003-11-10 16:17) [13]Вот про опции выравнивания - это для чего и в каких случаях ???
Например: функция в DLL написанной на C хочет в качестве параметра указатель на struct c тремя полями - байтами.
Делаем объявление в Delphi;
PMyRec = ^TMyRec;
TMyRec = record
field1,
field2,
field3 : Byte;
end;
Логически - и там и там одинаковые типы.
Но в Delphi из за выравнивания структура занимает больше памяти, чем в C. В результате функция в DLL либо прочитает твои байты не оттуда где они лежат, либо запишет их не туда, откуда программа на D будет их читать после возврата из DLL.
Поэтому выравнивание в D надо отключать.
← →
Игорь Шевченко (2003-11-10 16:21) [14]Reindeer Moss Eater © (10.11.03 16:17)
> Поэтому выравнивание в D надо отключать.
поэтому выравнивание в D надо настраивать аналогично выравниванию в С, которое выравнивание обычно указывается в .h-файле
← →
Reindeer Moss Eater (2003-11-10 16:24) [15]Согласен разумеется.
Правда не встречались мне сишные библиотеки с выравниванием. Видимо кругозор узок.
:)
← →
willys (2003-11-10 17:45) [16]> Reindeer Moss Eater © (10.11.03 16:24) [15]
Согласен разумеется.
Правда не встречались мне сишные библиотеки с выравниванием. Видимо кругозор узок.
:)
странно, мне вот никогда не встречались библиотеки без выравнивания. :)
кстати, может быть кто-нибудь подскажет, что делать если в пределах одной структуры используется несколько границ выравнивания?
например,
struct my_struct
{
#pragma align 4
char x, y;
#pragma align 2
char z;
#pragma align 4
char q, w, e;
};
← →
Игорь Шевченко (2003-11-10 17:56) [17]willys © (10.11.03 17:45)
> странно, мне вот никогда не встречались библиотеки без выравнивания.
> :)
kernel32.dll, user32.dll, gdi32.dll
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c