Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-2233
-=DeMoH=-
2003-09-23 22:48
2004.02.02
Как отобразить 3D функцию на экране?


9-1942
craker
2003-07-09 15:31
2004.02.02
GlScene как его поставить?


1-2092
Марат
2004-01-19 14:37
2004.02.02
HotKey


3-2035
Pako
2004-01-06 07:23
2004.02.02
SQL


3-2036
СлБ
2004-01-06 08:12
2004.02.02
QuickReport программно сохранить/открыть отчет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский