Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
1-99148
oleg_apmath
2002-12-18 13:35
2002.12.30
XML & Delphi


3-99006
s_o
2002-12-10 15:57
2002.12.30
работа с базами данных


14-99267
Grifon
2002-12-05 15:20
2002.12.30
Как убежать от дяди Сэма?


14-99325
Peter Gluhiy
2002-12-10 13:07
2002.12.30
Проблема с AGP.


3-99009
Alfred77777777
2002-12-10 19:53
2002.12.30
Валится ошибка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский