Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> экспорт из с++ в делфи 
:(
    Опции темы
VanHelsing
Дата 19.10.2011, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6





Мне необходимо из длл биб-ки написанной на си вызвать процедуру,которая имеет следующее описание
[color=red]

Код

__declspec(dllexport) void Spisok_master(std::string** str_mass);[/color]


 Подскажите пожалуйста как преобразовать эту процедуру из с++ в делфи

делаю так

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  Ar = array [0..5] of string;
  ArP = ^Ar;

{procedure Zapusk; stdcall;
  external 'dllUSBTKP.dll' name 'Zapusk';  }

procedure Test; stdcall;
  external 'dllTMKsend.dll' name 'Test_begin';

procedure Opred_master(str: string); stdcall;
  external 'dllCOMPort.dll' name 'Opred_master';

procedure Spisok_master(Arr: ArP); stdcall;
  external 'dllCOMPort.dll' name 'Spisok_master';

procedure Zapusk; stdcall;
  external 'dllUSBTKP.dll' name 'ZAPUSK';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  str1: string;
  Arr1  :^Ar;
begin
 // str1 := 'gdfgdfgdg';
 Spisok_master(@Arr1);
 // Opred_master(str1);
 // Zapusk;
 // Test;
end;

end.



ничего не получается((



--------------------
PM MAIL   Вверх
Alexeis
Дата 19.10.2011, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



>__declspec(dllexport) void Spisok_master(std::string** str_mass);

Передача объекта за границу модуля, такое даже на стыке С++ легко может привести к непредсказуемым результатам, тем более при использовании разных языков.

Передавайте либо COM строки, либо простые типы, например const wchar_t* , если массив строк, то const wchar_t**  иначе беда.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Чучмек
Дата 19.10.2011, 12:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Я не знаю как правильно это перевести, но где сказано  про 6-ти элементный массив???
Попробуй так:
Код

procedure Spisok_master(var Arr:array of string); stdcall;




Это сообщение отредактировал(а) Чучмек - 19.10.2011, 12:21


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
VanHelsing
Дата 19.10.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Дело в том что редактировать библиотеку я не могу, ее писал другой человек и мне ее необходимо использовать в своей программе.
Цитата

Я не знаю как правильно это перевести, но где сказано  про 6-ти элементный массив???
Попробуй так:
Выделить всёкод Pascal/Delphi
1:
    
procedure Spisok_master(var Arr:array of string); stdcall;


Это я просто экспериментировал, а изначально я пробовал 
Код

type
  Ar = array of string;

И при выполнении экспортируемой процедуры Spisok_master возникает Access violation.


--------------------
PM MAIL   Вверх
Alexeis
Дата 19.10.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(VanHelsing @  19.10.2011,  14:25 Найти цитируемый пост)
Дело в том что редактировать библиотеку я не могу, ее писал другой человек и мне ее необходимо использовать в своей программе.

   Тогда единственный вариант, узнать в какой среде была написана библиотека и разобрать бинарную структуру объекта, после чего написать readonly wraper класса на стороне делфи. Объекты для этих целей не подойдут, поскольку в делфи VMT запихивается по умолчанию, значит нужно написать record с методами доступа к полям данных. Важно чтобы размеры рекорда совпадали с размером объекта std::string в реализации той среды в которой она была скомпилирована. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
VanHelsing
Дата 19.10.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Цитата

Тогда единственный вариант, узнать в какой среде была написана библиотека и разобрать бинарную структуру объекта, после чего написать readonly wraper класса на стороне делфи. Объекты для этих целей не подойдут, поскольку в делфи VMT запихивается по умолчанию, значит нужно написать record с методами доступа к полям данных. Важно чтобы размеры рекорда совпадали с размером объекта std::string в реализации той среды в которой она была скомпилирована. 

Если я правильно понял, то при данном раскладе мне реализовать нормальную работу не получился?



--------------------
PM MAIL   Вверх
Чучмек
Дата 19.10.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



А функция вообще что нибудь возвращает?
Код

procedure Spisok_master(p:pointer); stdcall;
....
var
m:array[0..1023] of cardinal;
....
fillchar(m,sizeof(m),0);
Spisok_master(@m);


Изменится значение в m[0] ?


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Alexeis
Дата 19.10.2011, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(VanHelsing @  19.10.2011,  15:36 Найти цитируемый пост)

Если я правильно понял, то при данном раскладе мне реализовать нормальную работу не получился?

  В режиме только для чтения получиться, может еще заменять одни символы другими, усекать размер строки. Короче все что НЕ связанно с перераспределением памяти можно будет решить. Не получиться выделить место в с++ либе и освободить в проге на делфи и наоборот. 

  И еще, чего вы решили что С++ использует по умолчанию соглашение stdcall ? Напротив, по умолчанию принято cdecl . 

  При наличии времени и терпения можно нагородить много чудес.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
VanHelsing
Дата 19.10.2011, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Код

__declspec(dllexport) void Spisok_master(std::string** str_mass);

Как я понимаю в качестве параметра должен передаваться указатель на массив указателей?
Цитата

 Тогда единственный вариант, узнать в какой среде была написана библиотека и разобрать бинарную структуру объект

Eclipse


--------------------
PM MAIL   Вверх
Alexeis
Дата 20.10.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(VanHelsing @  19.10.2011,  18:24 Найти цитируемый пост)
Как я понимаю в качестве параметра должен передаваться указатель на массив указателей?

  Примерно так будет правильно в делфи
Код


  const 
     max_count = 1048576;
  type
     TAr = array [0..max_count-1] of TWRstring;

procedure Spisok_master(var Arr: ^TAr); cdecl;
  external 'dllCOMPort.dll' name 'Spisok_master';


Для начала нужно узнать размер std::string в эклипсе, точнее в том SDK, которое используется с эклипсом.
Вот например структура std::string в билдере. Повторить такое в делфи с не составит труда.
Код

{
char    ShortStrBuf[16];
char   *ptr;     //указатель на буфер строки

size_t  _Mysize; //длинна строки 
size_t  _Myres;  //длинна буфера

_Alty   _Alval; //объект класса аллокатора (если объект используется как константа, то можно просто дополнить до размера 40 байт)
//Иначе придется реализовывать и стандартный аллоктор полностью совместимый с реализацией STL, задача непростая.
}


итого 40 байт.

Это сообщение отредактировал(а) Alexeis - 20.10.2011, 09:35


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
alexSl
Дата 20.10.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


проходил мимо



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 22.2.2008

Репутация: нет
Всего: нет



VanHelsing, 

Вам при экспорте функций из С++ надо учитывать еще такое явление как name mangling.
PM MAIL   Вверх
CROTishka
Дата 25.10.2011, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 30.7.2009

Репутация: нет
Всего: 2



Цитата

Если я правильно понял, то при данном раскладе мне реализовать нормальную работу не получился?

Можно, всё можно. 

Про calling conventions здесь уже написали, это раз.
Второе, прочитайте статью "Использование в Delphi классов, созданных в Visual C++" - она на многих ресурсах в сети растиражирована.
Третье: что у вас делает string?!?!? String(in the default {$H+} state is AnsiString) это уникальный дельфёвый тип. Ни в одном из других языков нет аналогов, везде используются null-terminated strings (PChar). 
Третье, выставите выравнивание ("record field alignment") в своем проекте такое же, как в библиотеке, иначе у вас всё поедет. (ещё может быть вам стоит packed record использовать?)
И будет вам счастье. если что-то не получается - опишите тут подробно, что уже сделали, что получается вместо того, что бы вам хотелось (подробно).

А после всего этого у**ите того, кто писал эту сишную библиотеку тапкой и заставьте обернуть всё по-человечески в COM, и не парить вам мозги. Ибо если у вас это и будет работать, то на другой машине с другой битностью винды и/или процессора может не заработать. Не заставляйте мучиться себя, ваших клиентов, и тех, кто после вас будет поддерживать этот ужасный код.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0802 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.