Передача двоичных данных из библиотеки DLL Qt / C ++ в хост-приложение Delphi

В программе я хочу использовать QImage.bits () в Delphi. Итак, в Qt я создал dll. Исходный код DLL Перечислен ниже:

test.h:

  #ifndef TEST_H
#define TEST_H

#include "test_global.h"

extern "C"{
TESTSHARED_EXPORT uchar* testFunc();
}#endif // TEST_H

test.cpp:

 #include "test.h"#include <QtGui>

QImage image;

uchar* testFunc(){
image.load("c:\\1.png","PNG");
return (uchar*)image.constBits();
}

а в Delphi Side я использую этот код для использования Qt dll:

    function testFunc(): PByteArray; external 'test.dll';
// ...

procedure TForm3.Button1Click(Sender: TObject);
var
bStream: TBytesStream;
P: PByteArray;
Size: Cardinal;
begin
P := testFunc;
Size := Length(PAnsiChar(P)); // AnsiChar = 1 Byte
bStream := TBytesStream.Create();
try
bStream.Write(P[0], Size); // Works Fine (^_^)
bStream.Position := 0;
bStream.SaveToFile('c:\scr.txt');
finally
bStream.Free;
end;
end;

когда я вызываю функцию dll, никакие данные не возвращаются!
вы не могли бы мне помочь?

Обновление 1:
В реальной ситуации моя функция Qt очень сложна, и я не могу написать ее в Delphi по многим причинам. На самом деле оригинальная функция берет снимок экрана с устройства и работает на нем в основной памяти. и в результате я хочу отправить байты этого изображения в Delphi для показа на TImage без сохранения на жестком диске и в подобных воспоминаниях. и в этой теме я только что создал простую похожую функцию для простой отладки и тестирования. Можно ли помочь мне, написав действительно простой код для этой проблемы? Большое спасибо за вас. (-_-)

3

Решение

Более простым было бы использовать PByte aka ^ Byte, а не PByteArray.
Хотя TByteArray является статическим типом, использование массивов увеличивает риск случайной опечатки, такой как использование динамических массивов.


Не используйте PChar — он остановится на первом нулевом байте. Изображение не является строкой, оно может содержать сотни нулей.

Вы должны отправить длину как отдельную переменную / функцию.
int QImage :: byteCount () const
http://qt-project.org/doc/qt-4.8/qimage.html#byteCount


Отредактируйте свой вопрос, пожалуйста. Вы спрашиваете о битах или constbits? это разные свойства!


Также:

Вы должны узнать о «соглашениях о вызовах» в своих компиляторах, C ++ и Pascal.
Вы бы лучше могли отслеживать это на уровне ассемблера.

попробуйте пометить эту процедуру с помощью директивы «cdecl» в коде Pascal или, возможно, с помощью директивы «stdcall» в коде C и Pascal.

Попробуйте утилиту h2pas из FreePascal для автоматического преобразования.


Теперь лучше всего — падение Qt здесь. Создание мостов Qt просто для чтения файла PNG очень странно и хрупко. Существует ряд нативных библиотек Delphi с поддержкой PNG. Несколько примеров:

5

Другие решения

Задача решена. (^_^)

Для решения этого:

В Qt Side:

test.h:

#ifndef TEST_H
#define TEST_H

#include "test_global.h"

extern "C"{
TESTSHARED_EXPORT char* testFunc(int &a);
}#endif // TEST_H

test.cpp:

#include "test.h"#include <QtGui>

QImage image;
QByteArray ba;char* testFunc(int &a){
image.load("c:\\2.png","PNG");
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer,"PNG");
a = ba.size();
return ba.data();
}

В Delphi Side:

function testFunc(var aByteCount: DWORD): PByte;cdecl external 'test.dll';

// ...
var
bStream: TBytesStream;
Size: DWORD;
procedure TForm3.Button1Click(Sender: TObject);
var
P: PByte;
s: TStringList;
begin
Caption := '0';
P := testFunc(Size);
bStream := TBytesStream.Create();
try
bStream.Write(P[0], Size);
bStream.Position := 0;
bStream.SaveToFile('c:\my.png');
finally
Caption := IntToStr(Size);
end;
end;

Еще раз спасибо за «Arioch The» и «» Дэвид Хеффернан «». (^_^)

2

По вопросам рекламы [email protected]