Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обращение из Delphi к DLL написанной на C++ [D7, WinXP]


Страницы:   1 2 3

smirnoff ©   (2009-07-03 12:02:00) 

Здравствуйте! У меня вопрос по работе с типом puchar. Такая ситуация: имеется dll файл написанный на C++Builder. Из dll экспортируется функция следующим образом

extern "C" bool __declspec( dllexport ) func1(unsigned char *input, unsigned char *output);

В проекте Delphi импортируем эту функцию:

function func1(input: pointer; output: pointer): bool; cdecl;
external 'my.dll' name '_func1';


Работаем с импортированной функцией func1:

procedure TForm1.Button1Click(Sender: TObject);
var
 i :integer;
 s : string;
 a: array[0..30000] of char;
 b: ^uchar;

 a2: array[0..60000] of uchar;
 b2: ^uchar;
begin
StrCopy(a, pchar(Memo1.Text));

b := @a;
b2 := @a2;

func1(b,b2);

for I := 0 to Length(Memo1.Text) do
s := s + chr(a2[i]);
Memo2.Text := s;
end;


Проблемав том, что func1 видит только первый (нулевой) символ массива "a", а необходимо, чтобы весь массив был доступен для dll.

Вот в dll выводится на экран параметр input
ShowMessage((char *)input);

Объясните, пожалуйста, как правильно передать указатель на uchar из Delphi в dll. Заранее огромное спасибо!


Пит   (2009-07-17 13:15:00) [1]

Удалено модератором
Примечание: последнее предупреждение.


Anatoly Podgoretsky   (2009-07-16 14:36:00) [2]

> KSergey  (16.07.2009 14:06:42)  [42]

Не выдумывай, никакие три байта не обнуляются, проверятся как есть.


KSergey   (2009-07-16 14:06:00) [3]

> Пит   (16.07.09 12:28) [40]
> Правильно я понял?

Да.
Правда про то, что bool не всегда в С++ был однобайтовый я до прочтения той ссылке не ведал.

Ну и, вероятно, Anatoly Podgoretsky в [41] более гамотно выражается, но я не всех написанных там слов знаю смысл.

К стати в этом смысле рабооать с BOOL - быстрее! во всяком случае при передаче в/из функции, т.к. передается все равно 4-х байтовое слово, а при проверках всегда еще добавляется командочка обнуления старших 3-х байт. о как...


Anatoly Podgoretsky   (2009-07-16 13:10:00) [4]

> Пит  (16.07.2009 12:28:40)  [40]

В Дельфи Bool это Generic тип, соответственно у него нет определенного размера. Включен для поддержки АПИ


Пит   (2009-07-16 12:28:00) [5]

Непонятно, что конкретно ты хотел сказать.
Ну если лень писать - тогда попишу я, не привыкать )))

Ты хотел сказать, что в VC++ до версии 5.0 bool был 4-ех байтовым, начиная с пятой стал однобайтовым.
BOOL везде 4-ех байтовый.

В дельфи же bool 4-ех байтовый, а boolean однобайтовый.

Правильно я понял?


KSergey   (2009-07-16 08:19:00) [6]

> Пит   (14.07.09 12:19) [37]
> Чем bool в С++ так сильно отличается от bool в дельфи?

Я уже давал ссылку, в разделе "Microsoft Specific" там все подробно расписано про С++.
Про регистронечувтсвительность одного и чувтсвительность другого я тоже вроде вполне определенно писал.
Что именно еще непонятно?


Anatoly Podgoretsky   (2009-07-14 12:31:00) [7]

bool <> BOOL


Пит   (2009-07-14 12:19:00) [8]

KSergey, так ты можешь в конце концов пояснить свою точку зрения?

Чем bool в С++ так сильно отличается от bool в дельфи?


KSergey   (2009-07-14 08:32:00) [9]

Ну тогда и я уточню:

> KSergey ©   (13.07.09 14:51) [33]
> я их как раз недавно пытался на "общую" VCL "пересадить"

"их" - MS VC++ и Delphi


clickmaker   (2009-07-13 17:01:00) [10]

> [32] KSergey ©   (13.07.09 14:50)

ну конечно, я имел в виду, что билдер пользуется дельфовой vcl, которая на паскале написана, как известно )


Anatoly Podgoretsky   (2009-07-13 15:55:00) [11]

общая с Дельфи, по контесту с предыдущими сообщениями.


KSergey   (2009-07-13 14:51:00) [12]

я их как раз недавно пытался на "общую" VCL "пересадить" - спасибо что Дуп вовремя отговорил от ереси и уберег от согрешения.


KSergey   (2009-07-13 14:50:00) [13]

> clickmaker ©   (13.07.09 12:12) [31]
> в MS VC... . В билдере- не в курсе.
>  Но подозреваю, что если VCL у них общая,

???!!!


clickmaker   (2009-07-13 12:12:00) [14]

> в чем отличие?

в MS VC это может быть и 4 и 1 байт. В билдере - не в курсе. Но подозреваю, что если VCL у них общая, то должна быть совместимость типов


Пит   (2009-07-13 11:58:00) [15]


> В Си нету bool. А вот в С++ - есть. В книжках все написано
> :)

это все здорово. Но вернемся к баранам.
Ты сказал:

bool в дельфи и bool в C++ - сильно очень разное

bool в дельфи это 4-ех байтовый флаг, LongBool. Ноль интерпретируется как false, все отличное от нуля как true.

По твоим словам в С++ это нечно сильно другое. Я и хотел узнать - в чем отличие?


Anatoly Podgoretsky   (2009-07-13 11:55:00) [16]


> icWasya ©   (13.07.09 10:39) [28]

Не стоит фантазировать насчет порядка.


icWasya   (2009-07-13 10:39:00) [17]

И всё-таки __declspec( dllexport )- это stdcall.
Может быть и скомпилируется с cdecl, но порядок параметров будет другой. Потом будете сильно удивлятся.


KSergey   (2009-07-12 13:02:00) [18]

> Пит   (10.07.09 17:44) [26]
>  А что же такое bool в Си?

В Си нету bool. А вот в С++ - есть. В книжках все написано :)
http://msdn.microsoft.com/en-us/library/tf4dy80a(VS.71,loband).aspx

А BOOL в С++ для виндовс - это вообще define. Про другие ОС не в курсе.


Пит   (2009-07-10 17:44:00) [19]


> ergey ©   (10.07.09 10:44) [24]

а вот это меня уже заинтересовало.

bool в дельфи это 4-ех байтовый. boolean - однобайтовый.

BOOL в Си я так понимаю ты имеешь в виду четырехбайтовый. А что же такое bool в Си?


KSergey   (2009-07-10 10:46:00) [20]

> KSergey ©   (10.07.09 10:44) [24]
> тогда все будет хорошо

Это, разумеется, не мантра, т.е. объяснение "почему" - очень даже есть, надо просто посмотреть чем отличается bool и BOOL в С++.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо