![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как pchar в string перевести
h_tray © (2002-12-06 09:28:00)В dll есть такая функция для определения лок имени компьютера
-------------------------------------
function gcn:pchar;
var
lpbuffer : array[0..max_computername_length] of char;
cd: dword;
begin
cd:=sizeof(lpbuffer);
GetComputerName(lpbuffer,cd);
result:=lpbuffer;
end;
-----------------------------------------------
В коде вызываю динамически эту функцию
procedure TForm1.Button1Click(Sender: TObject);
var
s:function:pchar;
libhandle:thandle;
name:pchar;
begin
@s:=nil;
libhandle:=LoadLibrary("test.dll");
if libhandle>=32 then begin
@s:=GetProcAddress(libhandle,"gcn");
if @s<>nil then begin
Label1.Caption:=name;// Вот сдесь то он херню а не имя компаend;
end;
freelibrary(libhandle);
end;
alsha (2002-12-06 15:03:00) [1]function gcn: string;
varfunction gcn: string;
var
Len: cardinal;
begin
Len:=127;
SetLength(Result,Len);
GetComputerName(pchar(Result),Len);
SetLength(Result,Len);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:=gcn;
end;
oomneeq (2002-12-06 14:50:00) [2]C учетом
>Alx2 © (06.12.02 09:33)
можно конечно, проехать
но без учета
>oomneeq © (06.12.02 11:55)
можно можно снова тормознуться, хотя может и пронести -
как карта (память) ляжет !
но мы ведь программируем, а не в карты режемся :)
Alx2 (2002-12-06 13:20:00) [3]>oomneeq © (06.12.02 11:55)
уже проехали. см Alx2 © (06.12.02 09:33)
oomneeq (2002-12-06 11:55:00) [4]function gcn:pchar;
var
lpbuffer : array[0..max_computername_length] of char;
cd: dword;
begin
cd:=sizeof(lpbuffer);
GetComputerName(lpbuffer,cd);
result:=lpbuffer;//<---- Нехорошо это!
end;
PChar"овский result ссылается на локальный буфер
ой, нехорошо.
да и хэлп о том же:
-----------
A common error when working with PChars is to store in a data structure, or return as a value, a local variable. When your routine ends, the PChar will disappear because it is simply a pointer to memory, and is not a reference counted copy of the string. For example:
function title(n: Integer): PChar;
var
s: string;
begin
s := Format("title - %d", [n]);
Result := PChar(s); // DON"T DO THIS
end;
This example returns a pointer to string data that is freed when the title function returns.
perov (2002-12-06 09:42:00) [5]Label1.Caption := String(s);
Alx2 (2002-12-06 09:35:00) [6]>cpp © (06.12.02 09:33)
Точно!
Alx2 (2002-12-06 09:33:00) [7]>h_tray © (06.12.02 09:28)
function gcn(Buffer : pchar; MaxLen : Integer):pchar;
begin
GetComputerName(buffer,Maxlen);
result:=buffer;
end;
cpp (2002-12-06 09:33:00) [8]А где вы переменной Name что-либо присваиваете?