Gelen SDK örnekleri C# ile yazılmış. Örneklerde 10 MB lık bir değişken-diziyle veriler alınıyor.
Dll dosyası içinden GetDeviceData fonksiyonunu çağırmam gerekiyor.
[Function]
int GetDeviceData(HANDLE handle, char *Buffer, int BufferSize, const char *TableName, const char *FieldNames,const char *Filter, const char *Options)
C# örneği:
----------------------
Kod: Tümünü seç
int ret = 0;
int BUFFERSIZE = 10 * 1024 * 1024;
byte[] buffer = new byte[BUFFERSIZE];
string devtablename = "user";
string str = "*";
string devdatfilter = "";
string options = "";
ret = GetDeviceData(h, ref buffer[0], BUFFERSIZE, devtablename, str, devdatfilter, options);
Şimdi bunu Delphiye nasıl uyarlayacağım? Biraz üzerinde çalıştım fakat takıldığım nokta Stack overflow hatası...
Kod: Tümünü seç
interface
.
.
.
Type
TGetDeviceData = Function(Handle:THandle; var Buffer:PChar; Var BufferSize:Integer; TableName:PChar; Str: PChar; Filter:PChar; Options:PChar):integer; stdcall;
.
.
.
procedure TForm1.Button1Click(Sender: TObject);
const
//_BufferSize = 960000;
_BufferSize = 10*1024*1024;
var
CommDLL: TGetDeviceData;
DonenDeger : Integer;
_Buffer:Array[0.._BufferSize] of char;
Buffer:PChar Absolute _Buffer;
BufferSize:Integer;
TableName, STR, Filter, Options:PChar;
CihazHandle : THandle;
begin
CihazHandle := Cihazlar[1];
TableName := 'user';
STR := '*';
Filter := '';
Options := '';
BufferSize := _BufferSize;
@CommDLL := GetProcAddress(DLLHandle, 'GetDeviceData');
if Assigned(@CommDLL) then
DonenDeger := CommDLL(CihazHandle, Buffer, BufferSize, TableName, STR, Filter, Options);
memo1.lines.add(inttostr(DonenDeger));
end;
Yukarıdaki kodlarda dizinin uzunluğunu 960KB yaptığımda bir problem yok.
Fakat SDK örneğindeki gibi 10 MB yaptığımda Stack overflow hatası veriyor.
Dll içindeki fonksiyona geri dönüşü olan bir PAnsichar tipinde bir değişken yazmam gerekiyor.
Fakat buna nasıl C# daki gibi hafızada alan açabilirim.
Bir dizi tanımlayıp Absolute ile aynı yeri işgal edecek şekilde başka bir PAnsiChar ya da PChar tipinde değişken tanımlıyorum.
Fakat boyut 960KB yi geçince bu sorun oluşuyor.
Daha önce karşılaşan var mıdır? Ya da başka bir çözüm önerecek var mıdır?