мне необходимо создать простое gui-приложение для управления сервисом (страт/стоп/лог событий) на c++
в VS2008 создал WindowsFormApplication с помощью мастера, набросал эл-ты на форму и когда начал писать обработчики событий возникла проблема
при событии Form!_load выполняется след. код:
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
...
SERVICE_STATUS_PROCESS rdxStatus; //структура, в которой содержится информация о состоянии сервиса
...
if (!QueryServiceStatusEx( //ф-я заполняет структуру rdxStatus
rdxService,
SC_STATUS_PROCESS_INFO,
(LPBYTE) &rdxStatus,
sizeof(SERVICE_STATUS_PROCESS),
&bytesNeeded ) )
{
statusMessage = "QueryServiceStatusEx failed.";
CloseServiceHandle(rdxService);
CloseServiceHandle(rdxSCManager);
}
...
}
а при событии button2_MouseClick мне необходима эта заполненная структура:
private: System::Void button2_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
if ( !ControlService(
rdxService, // необходима структура заполненная при событии form1_load
SERVICE_CONTROL_STOP,
(LPSERVICE_STATUS) &rdxStatus ) )
{
statusMessage = "ControlService failed.";
} else {
statusMessage = "Trying to stop VzletService...";
}
...
}
Где и как следует объявить эту структуру, для того чтобы она была доступна из обоих функций?
Здравствуйте, qdrj, Вы писали:
Q>Где и как следует объявить эту структуру, для того чтобы она была доступна из обоих функций?
Если я правильно понял вопрос, то вам нужно просто написать
#include "Windows.h"
в stdafx.h
Здравствуйте, TheThief, Вы писали:
TT>Здравствуйте, qdrj, Вы писали:
Q>>Где и как следует объявить эту структуру, для того чтобы она была доступна из обоих функций?
TT>Если я правильно понял вопрос, то вам нужно просто написать
TT>TT>#include "Windows.h"
TT>
TT>в stdafx.h
Наверное я плохо описал проблему. В button2_MouseClick нужна структура rdxStatus, но SERVICE_STATUS_PROCESS rdxStatus это локальная переменная для ф-ии Form1_Load(ее поля заполняются именно в Form1_Load), поэтому в button2_MouseClick она не доступна. Мне нужно объявить ее так, чтобы она была доступна в всех ф-х класса Form1.
public ref class Form1 : public System::Windows::Forms::Form {
public:
Form1(void) { InitializeComponent(); }
protected:
~Form1() { if (components) { delete components; } }
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::Button^ button2;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::TextBox^ textBox2;
protected:
private:
System::ComponentModel::Container ^components;
...
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {}
private: System::Void label1_Click(System::Object^ sender, System::EventArgs^ e) {}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
...
}
private: System::Void button2_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
...
}
};
если попробовать объявить ее так:
public: SERVICE_STATUS_PROCESS rdxStatus;
то компилятор выдает:
error C4368: cannot define 'rdxStatus' as a member of managed 'RDX_GUI::Form1': mixed types are not supported
Здравствуйте, qdrj, Вы писали:
Q>если попробовать объявить ее так:
Q>Q>public: SERVICE_STATUS_PROCESS rdxStatus;
Q>
Q>то компилятор выдает:
Q>Q>error C4368: cannot define 'rdxStatus' as a member of managed 'RDX_GUI::Form1': mixed types are not supported
Q>
Вам не структуру объявить надо, а переменную, которая будет доступна из обоих ф-ций...
private: SERVICE_STATUS_PROCESS* m_prdxStatus;
Form1(void)
{
m_prdxStatus = new SERVICE_STATUS_PROCESS();
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
~Form1()
{
if (components)
{
delete components;
}
delete m_prdxStatus;
m_prdxStatus = NULL;
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
SERVICE_STATUS_PROCESS &rdxStatus = *m_prdxStatus;
}
ну как-то вот так