Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как снять конфигурацию компьютера с локальной машины?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Ardexx

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подробнее...

Всего записей: 10 | Зарегистр. 21-03-2014 | Отправлено: 15:30 17-04-2014
Ardexx

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так,вроде разобрался с этими проблемами... Но возникли новые))))
Итак вот код, Почему-то не работает. Взят из проги,которая работает ( http://easylab.net.ua/winapiany/proverka-ip-adresa )
 

Код:
 
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <winbase.h>
#include "Registry.hpp"
 
 
#include "Unit1.h"
 
 
//#pragma comment(lib,"Iphlpapi.lib")
#pragma link "iphlpapi.lib"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        PIP_ADAPTER_INFO pAdapterInfo;
    PIP_ADAPTER_INFO pAdapter = NULL;
    String tmp;
    String NameAdapter;
    String IdAdapter;
    String IpAddress;
    //String MacAddress;
    pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
    {
        pAdapterInfo=NULL;
        pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
    }
    pAdapter = pAdapterInfo;
    while (pAdapter!=NULL)
    {
        IdAdapter =  pAdapter->AdapterName;
        NameAdapter = pAdapter->Description;
        tmp="";
        for(unsigned x=0;x<pAdapter->AddressLength;x+=1)
            {
                tmp=tmp+IntToHex((int)pAdapter->Address[x],2);
                if(x!=pAdapter->AddressLength-1)
                tmp=tmp+"-";
            }
            IpAddress = pAdapter->IpAddressList.IpAddress.String;
 
    }
    Edit1->Text = NameAdapter;
    Edit2->Text = IdAdapter;
    Edit3->Text = IpAddress;
    Edit4->Text = tmp;
 
}
 

Библиотеку "iphlpapi.lib" копировал из папки psdk в папку с проектом.
 
И ещё ... про хард и материнку... Нашёл я код для жёсткого диска , но он довольно большой. Переделанный отсюда ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa390423(v=vs.85).aspx )
Итак вопрос. Случайно покороче нету?))) Или именно так и должно быть "общение " с WMI ?
О,и на будущее вопрос про БД. Предположительно хотел создать БД в access и заносить туда полученную инфу о конфигурации компа. Это сложно? Нужно просто взять значение из переменной "а" и занести её в БД. Без излишеств.
 
Ну и в заключении... Есть ли какой-нибудь идентификатор компьютера,который можно получить? А то боюсь серийник материнки не подойдёт(на ноуте его видно,а на стационарном компе поле пустое)
Заранее спасибо.

Всего записей: 10 | Зарегистр. 21-03-2014 | Отправлено: 14:49 22-04-2014
AndrMan

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Где и что неправуильно возвращается? В качестве ID можно взять, например, CPUID.

Всего записей: 156 | Зарегистр. 29-03-2003 | Отправлено: 08:35 23-04-2014
Ardexx

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
"Ошибка при запуске приложения (0xc00000142). Для выхода из приложения нажмите кнопку "ОК". " Эта ошибка возникает при компиляции. Я новичок в программировании и в использование билдера.Учусь на ошибках так сказать.
 
Ещё вопрос. Есть ли в реестре информация об операционной системе? У меня возникла идея,правда не уверен,что прокатит. Правильно ли я понимаю,что у каждого компа,где стоит ОС есть ID этой ОС? Но существует корпоративные ОС(на несколько компов) У них ID будут одинаковые? Вообщем можно ли как-то использовать инфу об ОС в качестве "главного" ID? (Не хочу я серийник материнки использовать,итак проблемы с кодом... Но их я хочу решить самостоятельно,весело Но вот Проблему выше я не смог решить...)
 
 
а что за "CPUID" ))) Я имею в виду где он находится?  
 

Всего записей: 10 | Зарегистр. 21-03-2014 | Отправлено: 15:43 23-04-2014
AndrMan

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если ошибка возникает на уровне компиляции, то проще посмотреть и исправить ошибку, а не говорить - не работает код. Если неизвестно, как поправить ошибку, тоже не проблема - спросить, что не так в конкретном месте, а не во всем коде. Про CPUID, например, здесь.

Всего записей: 156 | Зарегистр. 29-03-2003 | Отправлено: 08:09 24-04-2014
Ardexx

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может неправильно сказал. Возможно не при компиляции. Как только нажимаю на Run(F9) вылезает окошко с ошибкой "Ошибка при запуске приложения (0xc00000142). Для выхода из приложения нажмите кнопку "ОК". " Т.е я даже не могу увидеть результат.
 
 
Что касается CPUID спасибо,подумаю.

Всего записей: 10 | Зарегистр. 21-03-2014 | Отправлено: 10:47 24-04-2014
AndrMan

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ardexx
пройди по шагам - увидишь, где падает

Всего записей: 156 | Зарегистр. 29-03-2003 | Отправлено: 11:09 24-04-2014
Ardexx

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так и не смог решить эту проблему. Но пока её опустим.
Возникла очень необычная проблема)))
Есть код:

Код:
 
        static TDisplayDevice lpDisplayDevice;
 
            DWORD dwFlags;
            DWORD cc;
 
                        AnsiString b;
                        AnsiString c;
 
            lpDisplayDevice.cb = sizeof(lpDisplayDevice);
 
            EnumDisplayDevices(NULL,cc,&lpDisplayDevice,dwFlags);
 
                        b = lpDisplayDevice.DeviceString ;
                        c = lpDisplayDevice.DeviceID ;
 
 
 
                       Edit2->Text = b;
                      Edit3->Text = c;
 

Который работает как нужно. Проверял 100 раз.
Но как только пытаюсь сделать класс... он не работает.Пока (для проверки) реализация методов в главном файле.
Вот код 2-ух файлов :
 
Unit1.cpp

Код:
 
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "winbase.h"
#include "multimon.h "
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    DeviceDisplay =new QDisplayDivice ;
 
         DeviceDisplay->set_Name_and_Id_Device();
         Edit1->Text = DeviceDisplay->get_DeviceName();
         Edit2->Text = DeviceDisplay->get_DeviceId();
     delete  DeviceDisplay;
}
 
//---------------------------------------------------------------------------
  __fastcall QDisplayDivice::QDisplayDivice ()
{
    NameDevice="Aaa";
    IdDevice="Bbb";
}
void  __fastcall QDisplayDivice::set_Name_and_Id_Device()
{
 static TDisplayDevice lpDisplayDevice;
 DWORD dwFlags;
        DWORD cc;
 bool   A;
 
            lpDisplayDevice.cb = sizeof(lpDisplayDevice);
    A=EnumDisplayDevices(NULL,cc,&lpDisplayDevice,dwFlags);
 
            NameDevice = lpDisplayDevice.DeviceString ;
            IdDevice = lpDisplayDevice.DeviceID ;
 
 
        }
  //.....................
 

_______
 
Unit1.h

Код:
 
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
 #include "winbase.h"
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <string>
//---------------------------------------------------------------------------
class QDisplayDivice
{
public:
        __fastcall QDisplayDivice()  ;
 
                AnsiString NameDevice ;
                AnsiString IdDevice;
 
        void __fastcall set_Name_and_Id_Device() ;
 
        AnsiString get_DeviceName()
        {
            return NameDevice;
        }
 
        AnsiString get_DeviceId()
        {
            return IdDevice;
        }
        
 
    private:
};
 
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TEdit *Edit1;
        TEdit *Edit2;
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
        QDisplayDivice* DeviceDisplay;
 
};
//......................................
 
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
 

 
Переменной  bool   A я пытался найти строку ,которая всё портит. И нашёл.

Код:
EnumDisplayDevices(NULL,cc,&lpDisplayDevice,dwFlags);

Помогите класс сделать рабочим,я уже 3 дня мучаюсь ))))
Заранее спасибо

Всего записей: 10 | Зарегистр. 21-03-2014 | Отправлено: 11:50 28-04-2014 | Исправлено: Ardexx, 11:52 28-04-2014
kawai77

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
static TDisplayDevice lpDisplayDevice;
 DWORD dwFlags;
        DWORD cc;
 bool   A;
 
            lpDisplayDevice.cb = sizeof(lpDisplayDevice);
    A=EnumDisplayDevices(NULL,cc,&lpDisplayDevice,dwFlags);  

Использование не инициализированной переменных - плохой стиль программирования.
Согласно MSDN, второй параметр cc:

Цитата:
iDevNum  
[in] Index value that specifies the display device of interest. tla_shell  
The operating system identifies each display device in the current session with an index value. The index values are consecutive integers, starting at 0. If the current session has three display devices, for example, they are specified by the index values 0, 1, and 2.

Возможно при объявлении неинициализованной cc вне пределов класса в дебаг-сборке она заполняется нулем и вы получается данные для первого монитора. А при объявлении внутри класса там мусор, например 100. А мониторов в системе обычно один-два.

Всего записей: 4 | Зарегистр. 20-05-2014 | Отправлено: 15:46 27-05-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как снять конфигурацию компьютера с локальной машины?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru