【发布时间】:2012-09-07 06:37:36
【问题描述】:
在我想在 Delphi 中使用 QImage.bits() 的程序中。因此,在 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 端,我使用此代码来使用 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 上显示它,而不将它保存在硬盘和类似的内存上。在本主题中,我刚刚创建了一个简单的类似函数,用于简单的调试和可测试性。是否可以通过为这个问题编写一个真正简单的代码来帮助我?非常感谢你。 (-_-)
【问题讨论】:
-
这里不需要 Qt。你可以从 Delphi 读取 PNG 文件。
-
为什么会弄乱 TByteStream ?为什么不直接使用 TFileStream 呢?
-
回答“Arioch The”问题:但在实际情况下,不存在从设备返回的任何 png 图像文件和图像。因此,为了减少响应时间,我不能使用任何文件,并且我的应用程序必须使用主内存来加载图像数据并显示它。我的 Qt 函数非常复杂,我无法将其转换为 delphi 源代码。
-
回答“大卫赫弗南”:我知道。但是这个源代码是对我真正问题的简单模拟。
-
好的,那么您只需要正确调用约定并将
uchar*映射到PByte。就是这样。