Форум: "Основная";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
Вниз#0 Найти похожие ветки
← →
Maksss (2004-01-18 00:34) [0]как передать из DLL стринг если он содержит #0 ?
pchar сразу обрезает всё
← →
Anatoly Podgoretsky (2004-01-18 00:39) [1]1. надо передавать еще и длину - независит от языка
2. ShareMem - Дельфи
3. bpl - Дельфи
← →
Maksss (2004-01-18 00:51) [2]
function PrintScrean(Comp:integer;Big : Bool;out len : string):PChar;export;stdcall;
var bmp,bmp1 : TBitmap;
jpg : TJpegImage;
SS : TStringStream;
b : Pointer;
begin
bmp := TBitmap.Create;
Jpg:= TJpegImage.Create;
bmp.Width := GetSystemMetrics(0);
bmp.Height := GetSystemMetrics(1);
BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,GetDC(GetDesktopWindow),0,0,SRCCopy);
if Big then begin
bmp1 := TBitmap.Create;
bmp1.Width := 208;
bmp1.Height := 156;
StretchBlt(bmp1.Canvas.Handle, 0, 0,208, 156, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, SRCCOPY);
Jpg.Assign(bmp1);
bmp1.Free;
end else
Jpg.Assign(bmp);
Jpg.Modified :=true;
Jpg.CompressionQuality:=comp;
Jpg.ProgressiveEncoding := true;
SS := TStringStream.Create("");
Jpg.SaveToStream(SS);
Result:=PChar(SS.DataString);
len := ss.DataString;
Result := Pointer(SS.DataString);
bmp.Free;
jpg.Free;
SS.Free;
end;
вот сам код надо передать именно в виде текста
← →
Maksss (2004-01-18 00:56) [3]В визуалбейсике всё работает в дельфях обрезает
вот приёмник
procedure TForm1.Button2Click(Sender: TObject);
var
fun : function(comp:integer;SB:Bool;var len : integer): PChar; stdcall;
hDL :THandle;
f:file;
i : integer;
s : string;
begin
@fun:= nil;
hDL:= LoadLibrary(PChar("vclhost.dll"));
if hDL <> HINSTANCE_ERROR then begin
@fun:=GetProcAddress(Hdl, "PrintScrean");
c := nil;
if assigned(fun) then
s := fun(65,false,i);
end;
AssignFile(f,"1.jpg");
.......
end;
← →
Anatoly Podgoretsky (2004-01-18 13:36) [4]s := fun... - функция имеет тип PChar, соответственно при присвоении будут копироваться символы до #0, по определению именно так и определен PChar. Использовать вместо строковых функций - функции работы с PChar (StrXXX), там есть которые копируют по длине, не обращая никакого внимания на символы.
← →
Maksss (2004-01-19 00:34) [5]>функции работы с PChar (StrXXX),
если можно по подробней,plz
← →
McSimm (2004-01-19 10:53) [6]Приемнику в любом случае надо как-то определять конец строки.
PChar не более чем указатель. Если отбросить соглашение, что #0 сигнализирует об окончании строки, у приемника не остается способов его определить.
Как вариант, можно использовать сдвоенный #0, если такой вариант невозможен внутри данных, или передавать длину.
← →
Maksss (2004-01-20 06:24) [7]function PrintScrean(Comp:integer;Big : Bool;out len : integer):PChar;export;stdcall;
вместо PChar можно поставить string но тогда вылазит сообщение о неправильной операции с поитеромм
собственно в таком виде данные передаются полностью и без длинны(проверял на визуал бейсике) проблема с приемом именно на дельфях.
нужен пример мои мысли все зашли в тупик
← →
Anatoly Podgoretsky (2004-01-20 09:25) [8]А ты ленивый Парамоша - StrLCopy
← →
Maksss (2004-01-20 10:23) [9]>А ты ленивый Парамоша - StrLCopy
я не линивый
strlcopy что мне это дает если только одно обьявление fun : function(comp:integer;SB:Bool;var len : integer): PChar; stdcall;pchar уже всё обрезает
хотя функция в длл передаёт всё без обрезаний
кстати используя эту функцию(скорее всего не правильно) я висну и вребут
такчто мой труд над кодом терь можно помножить на время загрузки компа
← →
alex_*** (2004-01-20 10:34) [10]Ты представляешь что такое PChar? Это просто указатель. Что ты из него выберешь это твое дело.
← →
McSimm (2004-01-20 10:38) [11]>Maksss
PChar ничего не обрезает. Он просто указывает на начало строки.
Где находится конец этой строки надо определять.
← →
Anatoly Podgoretsky (2004-01-20 10:40) [12]А что такое len по твоему?
← →
McSimm (2004-01-20 11:15) [13]О, так длина строки все же возвращается (проглядел)
Как уже было сказано, поможет StrLCopy.
Вместо s := fun(65,false,i); (что не есть правильно)
нужно сначала принять PChar, потом выделить своей строке память SetLength(s, i); ,а затем скопировать область, используя в качестве приемника адрес первого символа строки s, т.е. @s[1].
(Желательно проверить, что длина больше нуля)
← →
panov (2004-01-20 12:17) [14]Пример:
library proc;
uses
windows,sysutils;
function RetPChar(out Len:Integer): PChar;stdcall;
var
s: String;
begin
s := "Эта строка будет передана в основной модуль";
Len := Length(s);
Result := AllocMem(Len+1);
move(s[1],Result^,Length(s));
end;
procedure DllMain(fdwReason:DWORD);
begin
case fdwReason of
DLL_THREAD_ATTACH: ;
DLL_THREAD_DETACH: ;
DLL_PROCESS_ATTACH:
begin
end;
DLL_PROCESS_DETACH:
begin
end;
end;
end;
exports
RetPChar;
begin
DllProc:=@DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.
Вызов:
function RetPChar(out Len:Integer): PChar; stdcall; external "proc.dll";
...
procedure TForm1.Button1Click(Sender: TObject);
var
Len: Integer;
p: PChar;
s: String;
begin
p := RetPChar(Len);
SetLength(s,Len);
Move(p^,s[1],Len);
ShowMessage(s);
FreeMem(p);
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c