Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
63 / 63 / 2
Регистрация: 10.03.2014
Сообщений: 73

Не могу узнать имя компьютера через GetComputerName()

16.02.2015, 19:42. Показов 5177. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал в Visual C++ проект Windows Forms Application для работы с WinAPI.

Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#pragma once
#include <stdio.h>
#include <stdlib.h>
#pragma comment (lib, "Advapi32.lib")
#pragma comment (lib, "kernel32.lib")
#include <windows.h>
#include <winbase.h>
#include <tchar.h>
#include <string>
//BOOL GetComputerName(
//  LPTSTR  IpBuffer,   //  Адрес  буфера  имени.
//  LPDWORD nSize   // Размер буфера имени.
//  );
 
namespace nameProject {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
 
    /// <summary>
    /// Сводка для MyForm
    /// </summary>
    public ref class MyForm : public System::Windows::Forms::Form
    {
    public:
        MyForm(void)
        {
            InitializeComponent();
            
            //
            //TODO: добавьте код конструктора
            //
        }
 
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~MyForm()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::Label^  label2;
    private: System::Windows::Forms::Label^  label3;
    private: System::Windows::Forms::Label^  label4;
    private: System::Windows::Forms::Label^  label5;
    protected:
 
    private:
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        void InitializeComponent(void)
        {
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->label2 = (gcnew System::Windows::Forms::Label());
            this->label3 = (gcnew System::Windows::Forms::Label());
            this->label4 = (gcnew System::Windows::Forms::Label());
            this->label5 = (gcnew System::Windows::Forms::Label());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(103, 186);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(75, 23);
            this->button1->TabIndex = 0;
            this->button1->Text = L"button1";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Location = System::Drawing::Point(12, 9);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(35, 13);
            this->label1->TabIndex = 1;
            this->label1->Text = L"label1";
            // 
            // label2
            // 
            this->label2->AutoSize = true;
            this->label2->Location = System::Drawing::Point(12, 43);
            this->label2->Name = L"label2";
            this->label2->Size = System::Drawing::Size(35, 13);
            this->label2->TabIndex = 2;
            this->label2->Text = L"label2";
            // 
            // label3
            // 
            this->label3->AutoSize = true;
            this->label3->Location = System::Drawing::Point(12, 72);
            this->label3->Name = L"label3";
            this->label3->Size = System::Drawing::Size(35, 13);
            this->label3->TabIndex = 3;
            this->label3->Text = L"label3";
            // 
            // label4
            // 
            this->label4->AutoSize = true;
            this->label4->Location = System::Drawing::Point(12, 107);
            this->label4->Name = L"label4";
            this->label4->Size = System::Drawing::Size(35, 13);
            this->label4->TabIndex = 4;
            this->label4->Text = L"label4";
            // 
            // label5
            // 
            this->label5->AutoSize = true;
            this->label5->Location = System::Drawing::Point(12, 137);
            this->label5->Name = L"label5";
            this->label5->Size = System::Drawing::Size(35, 13);
            this->label5->TabIndex = 5;
            this->label5->Text = L"label5";
            // 
            // MyForm
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(284, 261);
            this->Controls->Add(this->label5);
            this->Controls->Add(this->label4);
            this->Controls->Add(this->label3);
            this->Controls->Add(this->label2);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->button1);
            this->Name = L"MyForm";
            this->Text = L"MyForm";
            this->ResumeLayout(false);
            this->PerformLayout();
 
        }
#pragma endregion
        
        /*char *buffer = new char [256];
        unsigned int i = 256;
        LPDWORD size = (LPDWORD)i;*/
        
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {       
                 setlocale(0, "");
                 SYSTEMTIME sm;
                 GetSystemTime(&sm);
                 label1->Text ="Дата = " + Convert::ToString(sm.wDay);
                 char buffer[16];
                 DWORD size = 256;
                // size = sizeof(buffer);
                 if (GetComputerName((LPWSTR)buffer, &size)){
                     label2->Text = "Имя компа =  " + Convert::ToString(buffer); 
                 }
                 else{
                     label2->Text = "Имя компа не удалось извлечь";
                 }
 
                 char buffer2[16];
                 DWORD size2 = 256;
 
                if (GetUserNameA(buffer2, &size2)){
                     label3->Text = "Имя компа =  " + Convert::ToString(buffer2);
                 }
                 else{
                     label3->Text = "Имя компа не удалось извлечь";
                 }
    }
    };
}
Проблема в том, что Convert::ToString(buffer) возвращает строку true, с функцией GetUserNameA() - аналогичная ситуация.
Миниатюры
Не могу узнать имя компьютера через GetComputerName()  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2015, 19:42
Ответы с готовыми решениями:

Как узнать размер файла, к которому обращаются через OpenDialog?
Подскажите, как узнать размер файла, к которому обращаюсь через OpenDialog. Если задано имя файла...

Возможно через Console Application создать тоже приложение, что и через Windows Form Application?
Возможно через Console Application создать тоже приложение, что и через Windows Form Application?...

Узнать HWND главного окна.
Здравствуйте! Как мне узнать HWND окна моего приложения, которое я создаю в Visual C++ Express...

9
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
16.02.2015, 20:53
Что ж ты пишешь то? Буфер [16], а размер передаешь 256 ?
И функция хочет указатель на буфер, а ты ей его самого суешь. Адрес давай: &buffer
0
63 / 63 / 2
Регистрация: 10.03.2014
Сообщений: 73
16.02.2015, 21:17  [ТС]
Цитата Сообщение от rao Посмотреть сообщение
Что ж ты пишешь то? Буфер [16], а размер передаешь 256 ?
И функция хочет указатель на буфер, а ты ей его самого суешь. Адрес давай: &buffer
https://msdn.microsoft.com/ru-... s.85).aspx

MAX_COMPUTERNAME_LENGTH + 1 - размер буфера как раз порядка 16

size - как раз должен равняться 16, а не 256, но это не суть важно, я думаю.

&buffer
- зачем? ведь название массива и есть указатель?

Или я что-то путаю?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
16.02.2015, 22:07
Цитата Сообщение от auditseo Посмотреть сообщение
MAX_COMPUTERNAME_LENGTH + 1 - размер буфера как раз порядка 16
Тогда почему ты не создаёшь массив размером MAX_COMPUTERNAME_LENGTH + 1 ?
(LPWSTR) - зачем? Если у тебя массив типа char.
1
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
16.02.2015, 22:34
Лучший ответ Сообщение было отмечено auditseo как решение

Решение

короче так работает:
C
1
2
3
4
Char buffer[256];
DWORD size = sizeof(buffer);
if (GetComputerName((LPWSTR)&buffer, &size))
...
Добавлено через 9 минут
о блин, и так работает: GetComputerName(buffer, &size)
только вместо Convert::ToString я делал так:
C#
1
String ^ sBuffer = gcnew String(buffer);
Добавлено через 9 минут
Цитата Сообщение от auditseo Посмотреть сообщение
- зачем? ведь название массива и есть указатель?
это в CLI/C++ так, а в нормальном С++ переменная и указатель на нее - разные вещи.

тьфу, извращенство какое.. . будто в Visual Basic вляпался. .
1
63 / 63 / 2
Регистрация: 10.03.2014
Сообщений: 73
16.02.2015, 23:27  [ТС]
Цитата Сообщение от rao Посмотреть сообщение
тьфу, извращенство какое.. . будто в Visual Basic вляпался. .
Просто еще много лаб по winAPI, поэтому следующий вопрос: какой язык посоветуете для работы с ними?
(программу нужно реализовать в окнах)

это в CLI/C++ так, а в нормальном С++
- могли бы поподробнее, что к чему, в общем какой путь мне выбрать для работы с winAPI

Добавлено через 19 минут
Цитата Сообщение от castaway Посмотреть сообщение
Тогда почему ты не создаёшь массив размером MAX_COMPUTERNAME_LENGTH + 1 ?
Просто экспериментировал по разному, MAX_COMPUTERNAME_LENGTH + 1 - да, работает все правильно
(LPWSTR) - зачем? Если у тебя массив типа char.
C++
1
2
3
4
BOOL WINAPI GetComputerName(
  _Out_    LPTSTR lpBuffer,
  _Inout_  LPDWORD lpnSize
);
исходя из прототипа и без (LPWSTR) - выдавалась ошибка.

и в дагонку вопрос, удобно будет в Windows Forms Application создать игру(крестики нолики с неограниченным полем), до этого создавал в java. Было бы интересно узнать, какие бывают подводные камни и ваш совет по данному вопросу.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
17.02.2015, 19:47
Цитата Сообщение от auditseo Посмотреть сообщение
какой язык посоветуете для работы с ними?
Это наверное дело вкуса. Можно спорить, но мне кажется, что WinAPI подразумевает относительно низкоуровневое программирование, поэтому и язык должен быть с такими же возможностями. Спрашивается, зачем вызывать WinAPI'шные функции на С#, если там все это есть в библиотеке .NET ? Если используешь Windows Forms, то пиши на C# - это проще и удобнее. Хочешь WinAPI - тогда лучше С++. А у тебя CLI/С++ - "ни рыба ни мясо".
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
17.02.2015, 20:06
Цитата Сообщение от auditseo Посмотреть сообщение
- зачем? ведь название массива и есть указатель?
Или я что-то путаю?
Ничего не путаешь. Оратор погорячился. Но дело все равно не в этом.
0
63 / 63 / 2
Регистрация: 10.03.2014
Сообщений: 73
17.02.2015, 20:19  [ТС]
Цитата Сообщение от rao Посмотреть сообщение
А у тебя CLI/С++ - "ни рыба ни мясо".
Ясно, спасибо. Выбрал Windows Forms так как легко окна строить, а С++ - так как только его знаю.
1) А что можете сказать о MFC для простых логических игр? Или уже устарело?

2) WinAPI функции есть в библиотеке .NET? Через нее легче обращаться?

спасибо за ответы.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
17.02.2015, 20:44
Цитата Сообщение от Байт Посмотреть сообщение
Ничего не путаешь. Оратор погорячился.
да, было немного.

Добавлено через 6 минут
Цитата Сообщение от auditseo Посмотреть сообщение
А что можете сказать о MFC для простых логических игр? Или уже устарело?
Как кто-то писал: "самый мощный язык тот, которым владеешь в совершенстве".

Цитата Сообщение от auditseo Посмотреть сообщение
WinAPI функции есть в библиотеке .NET? Через нее легче обращаться?
Да, там понаворотили всего чего только душе угодно. Мильёны классов. Сами все делают. Пик прогресса вобщем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2015, 20:44
Помогаю со студенческими работами здесь

Узнать текущую папку и вывести в label + вопрос про shell и "directory\"
Добрый день. Для сабж действия пытаюсь использовать функцию int drive; static...

Как узнать индекс выделенной строки в listBox
как узнать индекс выделенной строки в listBoxе

Как узнать существует ли файЛ?
Как узнать, есть ли файл по адресу &quot;C:\файл&quot; ?

Data::DataTable узнать/отредактировать ячейку
Visual C++ 2008. Создаю Data::DataTable: Data::DataTable ^table1 = gcnew DataTable();...

Как узнать координаты курсора над rectangleShare?
Создаю новый элемент, что-то вроде таскбара, необходимо, чтобы при щелчке мышки по прямоугольнику ,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru