[решено] Загрузка библиотек созданных с QT/C++ в Delphi (не получается "общаться" с функциями из библиотеки...)

Модератор: Модераторы разделов

Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

[решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение Denjs »

товарищи) возможно я туплю под вечер..(и уже второй вечер кстати...). но ...
не получается у меня успользовать созданную в QT библиотеку в Delphi...

в QT создаю простейшую библиотеку с функцией типа

Код: Выделить всё

qint32 plusplus(qint32 i) {return i;}

собираю это дело под виндус, и пытаюсь подгрузить результат в Delphi-проекте и "запользовать" библиотечные функции...

в дельфи определяю ссылку на функцию вида

Код: Выделить всё

plusplus(i:integer):integer
... возн
а в результате... и загружается... и функция находится... но !
отдаю туда "10" возвращается что-то типа "1270002350"....

гм...? я просто не сопоставил корректно типы данных или тут какой подвох есть?

и с обычным integer в библиотеке вроде тоже пробовал ( int plusplus(int i) )...
тоже не выходит...

а как строки передавать...? использовать wchar_t * и toWCharArray()/fromWCharArray() на стороне QT? не выходит у меня...
от кучи вопросов на выходе до segmentation fault...
киньте в меня примером или где читать... ? дельфя в офисе - не могу "плотно" играться с ней... потому пример вида "helloworld" был бы очень кстати...
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
Alexx2000
Сообщения: 27
ОС: Mandriva 2010.0

Re: [решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение Alexx2000 »

Вы в Delphi функцию

Код: Выделить всё

plusplus(i:integer):integer

как объявили?
Так

Код: Выделить всё

plusplus(i:integer):integer;cdecl;

или

Код: Выделить всё

plusplus(i:integer):integer;stdcall;

так?
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: [решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение Denjs »

Да на самом деле никак)) т.е. без указания "stdcall;" или "cdecl;". )

Указал "stdcall;" - integer начал обрабатыватсья нормально.
Дальше буду разбираться со строками - думаю должно получиться...

Спасибо.
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
merl
Сообщения: 5
ОС: Linux x86 - Ubuntu Intrepid

Re: [решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение merl »

Denjs писал(а):
28.02.2008 13:19
Указал "stdcall;" - integer начал обрабатыватсья нормально.


а все потому, что в обжект паскале придуман свой супер-гениальный способ передачи параметров (насколько я помню, оно вообще в регистры передает).. потому и не кусают )
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: [решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение halturin »

merl писал(а):
28.02.2008 22:08
Denjs писал(а):
28.02.2008 13:19
Указал "stdcall;" - integer начал обрабатыватсья нормально.


а все потому, что в обжект паскале придуман свой супер-гениальный способ передачи параметров (насколько я помню, оно вообще в регистры передает).. потому и не кусают )

а мне что-то помнится, что в делфях другой порядок следования параметров в стек передается. stdcall как раз таки заставляет его не "химичить" со стеком, а делать как положено. хотя могу ошибаться, на столько давно это было :)
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: [решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение Denjs »

уф... разобрался )
пример передачи строк.
Думаю потом может кому и пригодится.

Delphi 6

В дельфи определяется ссылка на функцию :

Код: Выделить всё

type
  TMyProc  = function (str_i:PWideChar;str_o:PWideChar): integer; stdcall;
var
  MyImportProc  :  TMyProc;


кусок использующего кода на стороне Delphi:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  myWideString_o: WideString;  //исходящая строка
  myWideChar_o_Ptr: PWideChar;

  myWideChar_i_lenght: Integer;

  myWideString_i: WideString;     //строка-результат
  myWideChar_i_Ptr: PWideChar;

begin
  Handle:=LoadLibrary('probe_lib1.dll');
  if Handle>=32 then        // if <=32 - error !
  begin
//    memo1.Lines.Add('LoadLibrary("probe_lib1.dll") OK! ');
    @MyImportProc:=GetProcAddress(Handle,'helloworld_utf16');
    if @MyImportProc<>nil then
      begin
//         memo1.Lines.Add('GetProcAddress(Handle,"helloworld") OK!');

         SetLength(myWideString_o,1024);//пока выделим память так...
         myWideChar_o_Ptr := Addr(myWideString_o[1]);
         StringToWideChar('Сообщение-Приветвие!', myWideChar_o_Ptr, 50);

         SetLength(myWideString_i,1024);//пока выделим память так...
         myWideChar_i_Ptr := Addr(myWideString_i[1]);

         myWideChar_i_lenght := MyImportProc(myWideChar_o_Ptr,myWideChar_i_Ptr);

//         memo1.Lines.Add('sending : ['+ myWideChar_o_Ptr +']');
//         memo1.Lines.Add('returned string: ['+myWideChar_i_Ptr +']');
//         memo1.Lines.Add('returned string WideCharToString()-converted: ['+ WideCharToString(myWideChar_i_Ptr) +']');

      end
      else
//       memo1.Lines.Add('GetProcAddress(Handle,"helloworld")=nil !')
    ;
  end
  else
    memo1.Lines.Add('LoadLibrary("probe_lib1.dll") got error !');

  FreeLibrary(Handle);
  {}
end;


QT4.3
probe_lib1.cpp

Код: Выделить всё

#include "probe_lib1.h"

/*думается мне, что не хорошо пользовать wchar_t* по причине того, что при сетевом взаимодействии,
могут возникнуть "косяки".
т.е. если вдруг надо будет данные в формате wchar_t* пересылать по сети
их надо будет перерабатывать перед пересылкой - т.к. на разных платформах длина wchar_t* разная...
Хотя для локальной библиотеки это допустимый ход... :: qint32 helloworld(wchar_t *_string, wchar_t *_string_out ) //

вообще можно и QChar*, но нет удобной функции работы с нуль-заканчивающимися-строками
потому, работаем ushort* из соображений типа "четко зафиксировать типы данных и их длину".
*/
qint32 helloworld_utf16(ushort * _string, ushort * _string_out) // ждем здесь "дельфевый" PWideChar
{

    QString RetMsg;
    QString IncMsg;
    IncMsg=QString::fromUtf16(_string);

    //делаем обработку строки как нам надо.
    RetMsg=IncMsg.toLower()+QString("|")+IncMsg.toUpper();
    RetMsg=QString("Resived:["+IncMsg+"]  Processed :["+RetMsg+"]");

//  был-бы на выходе wchar_t* - мы бы сделали так:
//    int retmsgsize=strTemp.toWCharArray(_string_out);
//    _string_out[rez_2]=0; // отдаем  туда куда нам сказали... выделением памяти пусть занимается внешняя программа
// но на выходе - ushort* потому делаем так :
    const ushort *ptr0=strTemp.utf16();
    unsigned int q=0;
    for (; (ptr0[q]!=0)and(q<128000);q++ )    *(_string_out+q)=*(ptr0+q);
    _string_out[q]=ptr0[q];// '/0' туда-же...
    int retmsgsize=q;//strTemp.size();

  return retmsgsize;
}

и в probe_lib1.h файле

Код: Выделить всё

#include <QString>
extern "C" {
      qint32 helloworld_utf16(ushort * _string, ushort * _string_out);
}

Под виндой работает ) русские буквы обрабатываются. Думаю и все иные тоже должны-бы...
QT-шное приложение программу использующую библиотеку пока не собирарал - думаю проблем не будет.
Если есть замечания, улучшения - буду рад услышать.
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
bum
Сообщения: 138
ОС: Ubuntu 8.04

Re: [решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение bum »

Спасибо, познавательно. FreePascal я так понимаю работает аналогичным образом?
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: [решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение Denjs »

bum писал(а):
04.03.2008 20:13
Спасибо, познавательно. FreePascal я так понимаю работает аналогичным образом?

гм... а кто его знает? думаю если указание "stdcall;" поддерживается - то наверное должно быть оно так и есть...
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
Иван Шихалев
Сообщения: 167
Статус: принципиальный дилетант
ОС: Gentoo Linux

Re: [решено] Загрузка библиотек созданных с QT/C++ в Delphi

Сообщение Иван Шихалев »

Stdcall поддерживается. В последних версиях его указывать необходимо, поскольку по умолчанию так же, как в Delphi используется соглашение register.
Иван Шихалев
shikhalev.org
Спасибо сказали: