PDA

View Full Version : سوال: انتساب uchar* از یک dll به یک شی از نوع TBytesStream



BORHAN TEC
چهارشنبه 15 شهریور 1391, 17:12 عصر
سلام :قلب:

من یک dll را با استفاده از Qt ساخته ام که اینترفیس کلی آن به شکل زیر است:
#ifndef SCRSHOT_H
#define SCRSHOT_H

#include "scrshot_global.h"

extern "C"{
SCRSHOTSHARED_EXPORT uchar* TakeAndroidScreenShot();
}

#endif // SCRSHOT_H


و از کد بالا همانطور که مشخص است نوع خروجی تابع TakeAndroidScreenShot از نوع uchar* است. حال برای استفاده از dll بالا من از کد زیر استفاده کرده ام:
function TakeAndroidScreenShot(): PByteArray; external 'Modules\scrshot.dll';
// ...

procedure TForm3.Button2Click(Sender: TObject);
var
bStream: TBytesStream;
P: PByteArray;
i: Integer;
begin
bStream := TBytesStream.Create();
try
bStream.Write(TakeAndroidScreenShot()[0], 10); // AV Error Here (-_-)
bStream.Position := 0;
bStream.SaveToFile('c:\scr.png');
finally
bStream.Free;
end;
end;

اما در موقع اجرا با خطای AV برنامه متوقف می شود. لطفاً اگر شخصی در این زمینه تجربه ای دارد مرا راهنمایی کند.

با تشکر...

BORHAN TEC
چهارشنبه 15 شهریور 1391, 18:54 عصر
با اجرای کد های زیر متوجه شدم که مشکل اصلی از سمت برنامه ای است که در C++‎‎‎‎/Qt نوشته شده است و بنابراین مشکلم را در تالار Qt مطرح می کنم. به هر حال یک نمونه ساده از کدی که به درستی کار می کند را برای استفاده ی آیندگان قرار می دهم.

کد های سمت Qt::متفکر::لبخندساده::قلب:
#ifndef TEST_H
#define TEST_H

#include "test_global.h"


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


#endif // TEST_H


#include "test.h"

uchar* testFunc(){
return (uchar*)"Hello From Qt.";
}


کد های سمت Delphi: :قلب::قلب::قلب:

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;

موفق باشید...

BORHAN TEC
جمعه 17 شهریور 1391, 17:07 عصر
سلام
بالاخره با کمک تعدای از همکاران خارجی تونستم مشکل رو حل کنم. این هم از راهنمایی های اصلی در این رابطه:
http://stackoverflow.com/questions/12312968/how-can-i-use-qimage-bits-in-delphi-2010
http://www.qtforum.org/article/9484/how-to-convert-qimage-to-qbytearray-and-uchar-and-then-make-a-qmovie.html?477e9cf8#post37787
راهنمای Qt
به کار بردن مقداری خلاقیت!!!

و اما روش حل این مسئله!!!:لبخند:

در سمت C++/Qt باید از کدهای زیر استفاده شود.

فایل test.pro:
#-------------------------------------------------
#
# Project created by QtCreator 2012-09-05T06:52:11
#
#-------------------------------------------------

QT += gui

TARGET = test
TEMPLATE = lib

DEFINES += TEST_LIBRARY

SOURCES += test.cpp

HEADERS += test.h\
test_global.h


فایل 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();
}


و اما این هم از کدهای سمت دلفی:
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;