Форум: "WinAPI";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];
ВнизНебольшая проблемка Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c