Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-65960
Софейков Костя
2003-11-10 19:23
2003.11.20
циклы


3-65795
AndSoft
2003-10-30 13:40
2003.11.20
Помогите разобраться с ошибкой


1-65818
paul_k
2003-11-06 12:53
2003.11.20
Помогите подключить Crystal Reports к


14-66100
servs
2003-10-28 14:47
2003.11.20
чисто академическая задача по алгоритмам


1-65933
axx
2003-11-11 09:44
2003.11.20
Свой конструктор MDIChild формы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский