PDA

View Full Version : سوال: بازگشت دادن محتویات یک شی از نوع QImage از یک dll



BORHAN TEC
پنج شنبه 16 شهریور 1391, 16:17 عصر
با عرض سلام خدمت برنامه نویسان Qt :قلب:
راستش من هنوز زیاد با Qt آشنا نیستم (البته فعلاً! :چشمک:) و به یک مشکلی برخورد کرده ام که واقعاً اعصابم رو به هم ریخته است.

مشکل من این است:
من در محیط Qt یک dll را ساخته ام و قصد دارم که از این dll در محیط Delphi استفاده کنم. همه چیز به ظاهر درست به نظر می رسد و در مثال های ساده همه چیز به خوبی کار می کند. در واقع کار این dll این است که با استفاده از یک شی از کلاس QImage کارهایی را بر روی یک تصویر انجام می دهد و در آخر هم بایتهای آن تصویر را برگشت می دهد.

کد های سمت Qt به شرح زیر است:

فایل test.h:
#ifndef TEST_H
#define TEST_H

#include "test_global.h"


extern "C"{
TESTSHARED_EXPORT const uchar* testFunc();
}


#endif // TEST_H


فایل test.cpp:
#include "test.h"
#include <QtGui>

QImage image;

const uchar* testFunc(){
image.load("c:\\1.png");
return image.constBits(); // هیچ چیزی را بر نمی گرداند
// return (uchar*)"Hello From Qt."; // به درستی کار میکند
}


در محیط دلفی هم از کد زیر برای تست dll ساخته شده در Qt استفاده کرده ام. البته کدهای سمت دلفی مشکلی ندارد و مشکل از طرف کد های سمت Qt است:
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;

با تشکر از پاسخ های شما دوستان عزیز...

حامد مصافی
جمعه 17 شهریور 1391, 15:30 عصر
متد load کلاس QImage یک مقدار bool برمیگیداند. مقدار برگشتی را بررسی کنید false نباشد. همچنین از وجود فایل صویر اطمینان حال کنید.

BORHAN TEC
جمعه 17 شهریور 1391, 17:35 عصر
با سلام خدمت دوست عزیزم :قلب:
با تشکر از توضیحات شما ولی حل این مسئله به تغییرات بیشتری نیاز دارد که خوشبختانه چند دقیقه پیش توانستم این مشکل را حل کنم و توضیحاتی در این خصوص نیز در تاپیک زیر قرار داده ام که به خوبی نحوه کار را نشان می دهد:
http://barnamenevis.org/showthread.php?359799