Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.30;
Скачать: CL | DM;

Вниз

Небольшая проблемка   Найти похожие ветки 

 
AquaSun1   (2002-11-09 03:15) [0]

Возникла проблемка! Вот исходник:

procedure TForm1.BitBtn3Click(Sender: TObject);
Var LPTSTR:PChar; LPDWORD:DWord;
begin
LPDWORD:=255;
If GetComputerName(LPTSTR,LPDWORD) Then Label1.Caption:="Имя компьютера = "+LPTSTR;
If GetUserName(LPTSTR,LPDWORD) Then Label2.Caption:="Имя пользователя = "+LPTSTR;
end;


В Win98 работает первая функция, но неработает вторая, а в
Win2000 работает вторая функция, но неработает первая.
Попытка поменять местами строки ничего не изменила.
Подскажите, что не так.


 
Набережных С.   (2002-11-09 11:11) [1]

Сходи к Пушкину А.С., пусть память выделит.


 
Ketmar ©   (2002-11-09 11:52) [2]

в днк.

Satanas Nobiscum! 09-Nov-XXXVII A.S.


 
AquaSun1   (2002-11-14 03:51) [3]

При трассировке, после GetUserName(MyName,MyLength) или GetComputerName(MyName,MyLength) пишет:
Variable "MyName" inaccessible here due to optimization (Переменная "MyName недоступна здесь из-за оптимизации)
Попытка задать перед этим MyName:=""; ничего не меняет. (Если не задать MyName, перед тем как использовать пишет: Variable "MyName" might not have been initialized.)
Хотя иногда эти функции работают, только непонятно как, например вчера:

Var MyName:PChar; MyLength:DWord;
Begin
...
MyLength:=255; MyName:="";
If GetComputerName(MyName,MyLength) Then Label1.Caption:="Имя компьютера = "+MyName;
MyLength:=255; MyName:="";
If GetUserName(MyName,MyLength) Then Label1.Caption:="Имя пользователя = "+MyName;
MyLength:=255; MyName:="";
...
end;


- это не сработало, причём MyName (при трассировке) иногда определялось только после второй надписи MyName:="", т.е.
шаг 1: MyName = ""
шаг 2: MyName = Variable "MyName" inaccessible here due to optimization
шаг 3: MyName = "MYCOMPUTER"
шаг 4: MyName = Variable "MyName" inaccessible here due to optimization
шаг 5: MyName = "Polzovatel"
и выводился результат:

Имя компьютера =
Имя пользователя = MYCOMPUTER


- Меня это несколько поразило, тогда решил ввести переменную типа MyString: String;

MyLength:=255; MyName:="";
If GetComputerName(MyName,MyLength) Then MyString:=MyName;
Label1.Caption:="Имя компьютера = "+MyString;


- это не сработало, тогда попробовал по другому:

Label1.Caption:="Имя компьютера = ";
Label2.Caption:="Имя пользователя = ";
MyLength:=255; MyName:="";
If GetComputerName(MyName,MyLength) Then MyString:=MyName;
Label1.Caption:=Label1.Caption+MyString;
MyLength:=max_path-1; MyName:="";
If GetUserName(MyName,MyLength) Then MyString:=MyName;
Label2.Caption:=Label2.Caption+MyString;


- ура заработала, причем и та и другая! Но это было вчера, а сегодня (при запуске программы) выдаёт:

Имя компьютера = MYCOMPUTER
Имя пользователя = MYCOMPUTER


max_path в примере выше, никак на программу не влияет. Я его взял из какого-то другого примера, в котором использовалась одна из этих функций.

В Хелпе откопал фразу:
Если же требуется склеить два объекта типа PChar, то это надо сделать с помощью приведения типа: S := string(P1) + string(P2);
и решил записать так (полный текст всей программы):

procedure TForm1.BitBtn1Click(Sender: TObject);
Var MyString:String; MyName:PChar; MyLength:Cardinal;
begin
Label1.Caption:="Имя компьютера = ";
Label2.Caption:="Имя пользователя = ";
MyLength:=255; MyName:=""; шаг 1
If GetComputerName(MyName,MyLength) Then MyString:=String(MyName); шаг 2
Label1.Caption:=Label1.Caption+MyString; шаг 3
MyLength:=255; MyName:=""; шаг 4
If GetUserName(MyName,MyLength) Then MyString:=String(MyName); шаг 5
Label2.Caption:=Label2.Caption+MyString; шаг 6
MyLength:=max_path-1; MyName:=""; шаг 7
end;


При трассировке:
1:
Label1.Caption = "Имя компьютера = "
Label2.Caption = "Имя пользователя = "
MyLength = 255
MyName = ""
MyString = ""
2:
Label1.Caption = "Имя компьютера = "
Label2.Caption = "Имя пользователя = "
MyLength = 10
MyName = Variable "MyName" inaccessible here due to optimization
MyString = "MYCOMPUTER"
3:
Label1.Caption = "Имя компьютера = MYCOMPUTER"
Label2.Caption = "Имя пользователя = "
MyLength = 10
MyName = Variable "MyName" inaccessible here due to optimization
MyString = "MYCOMPUTER"
4:
Label1.Caption = "Имя компьютера = MYCOMPUTER"
Label2.Caption = "Имя пользователя = "
MyLength = 255
MyName = "MYCOMPUTER"
MyString = "MYCOMPUTER"
5:
Label1.Caption = "Имя компьютера = MYCOMPUTER"
Label2.Caption = "Имя пользователя = "
MyLength = 255
MyName = Variable "MyName" inaccessible here due to optimization
MyString = "MYCOMPUTER"
6:
Label1.Caption = Variable "Self" inaccessible here due to optimization
Label2.Caption = Variable "Self" inaccessible here due to optimization
MyLength = 255
MyName = Variable "MyName" inaccessible here due to optimization
MyString = "MYCOMPUTER"
7:
Label1.Caption = Variable "Self" inaccessible here due to optimization
Label2.Caption = Variable "Self" inaccessible here due to optimization
MyLength = 255
MyName = Variable "MyName" inaccessible here due to optimization
MyString = ""

На форме всё равно выдаёт:
Имя компьютера = MYCOMPUTER
Имя пользователя = MYCOMPUTER


При запуске EXE"шника (после закрытия формы):
в Win98 " Access Violation at address BFF711CF in module "KERNEL32.DLL". Read of address FFFFFFFF"
в Win200 " Access Violation at address 77F83DC6 in module "NTDLL.DLL". Write of address 00000000"

Последнее, что я сделал - заменил String(MyName) на MyName, т.е. всё, как раньше, но к сожалению это ничего не изменило (ошибки всё равно вылетают).


 
icWasya ©   (2002-11-14 10:20) [4]

procedure TForm1.BitBtn1Click(Sender: TObject);
Var MyName:array[0..255] of Char; MyLength:Cardinal;
begin

MyLength:=SizeOf(MyName);
If GetComputerName(MyName,MyLength) Then
Label1.Caption:="Имя компьютера = "+StrPas(MyName)
Else
Label1.Caption:="Неизвестный Компьютер";

MyLength:=SizeOf(MyName);
If GetUserName(MyName,MyLength) Then
Label2.Caption:="Имя пользователя = "+StrPas(MyName)
Else
Label2.Caption:="Неизвестный Юзверь"
end;


 
AquaSun1   (2002-11-15 17:01) [5]

Спасибо за попытку icWasya ©, но этот вариант у меня идёт также, как и первоначальный (см. AquaSun1 (09.11.02 03:15)). К томуже StrPas в Delphi 5 использовать не актуально. Копаясь в Хелпе, откопал ещё один вариант:

MyLength:=255; GetMem(MyName,MyLength);
If GetComputerName(MyName,MyLength) Then
Begin
CBInsert.Items[0]:=CBInsert.Items[0]+" ("+String(MyName)+")";
CBInsert.Items[1]:=CBInsert.Items[1]+" ("+String(MyName)+")";
End;
FreeMem(MyName);
MyLength:=255; GetMem(MyName,MyLength);
If GetUserName(MyName,MyLength) Then CBInsert.Items[2]:=CBInsert.Items[2]+" ("+String(MyName)+")";
FreeMem(MyName);


в Win98 правда работает только GetComputerName, но зато в Win2k работают обе функции.


 
icWasya ©   (2002-11-15 18:46) [6]

AquaSun1
у меня Win-98 SE ver 4.10.2222.A
и мой код работает
отличие кода AquaSun1 (15.11.02 17:01) от AquaSun1 (09.11.02 03:15) в наличие/отсутствие GetMem


 
AquaSun1   (2002-11-15 19:46) [7]

icWasya ©
Работать то, он и у меня работает, только при использовании второй функции (в твоём коде) выдаёт "Неизвестный Юзверь", что означет, что GetUserName(...)= False. Но в одном из тестов (см. выше) имя пользователя всётаки определялось. Так вот я бы хотел, чтобы GetUserName(...) заработала.



Страницы: 1 вся ветка

Текущий архив: 2002.12.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-99080
Донской
2002-12-19 15:58
2002.12.30
Исчезло меню интерфейса


6-99236
Мазут Береговой
2002-11-01 07:16
2002.12.30
Помогите Мазуту!


3-98996
Veronika
2002-12-10 12:10
2002.12.30
Подскажите методы настройки быстродействия FireBird


14-99322
Keymaster
2002-12-09 02:12
2002.12.30
Такой вот вопрос


1-99065
Z-man7777
2002-12-19 13:57
2002.12.30
Как быть с этим?!