Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как 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 что-либо присваиваете?


Наверх

Титульная страница Поиск, карта сайта Написать письмо