Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

Как импортировать тип данных из 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
3-65708
Timer
2003-11-01 22:02
2003.11.20
Окно Login


6-66049
silver
2003-09-25 18:00
2003.11.20
Как сделать подмену своего IP


4-66153
RustiK
2003-09-12 15:34
2003.11.20
Программная всатка символа


1-65846
Dark Elf
2003-11-07 18:37
2003.11.20
Редактирование в ComboBox


6-66029
I_Sword
2003-09-24 18:29
2003.11.20
MAC адреса компьютеров в локальной сети