Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с GetLastError, Вопросы по Windows Froms 
:(
    Опции темы
TheDestroyer
Дата 5.8.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Здравствуйте
Надо сделать приложение с визуальным интерфейсом. Для этого создаю проект Visual C++ - CLR - приложение Windows Forms.  Раньше создавал визуальные интерфейсы в Borland C++. Конструктор в Windows Forms похож на борландовский, структура проекта тоже схожа. Но есть некоторые вопросы:
1. Где лучше писать код обработчика события, например, нажатия кнопки? В открывающемся обработчике 
Код

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {...

или где-то еще?
2. Как правильно называется язык, на котором нужно писать создав такой проект? Не читый c++ же?
3. При объявлении текстовой переменной требуется объявлять так:
Код

String^ msg;
а не так
Код

String msg;
Что значит знак ^?
И как теперь работать со строковыми переменными как это было со String? (Например сделать msg.c_str())
4. Пытаюсь получить значение последней ошибки в программе с помощью GetLastError(). Взял кусок кода, который у меня работает в консольном приложении (проект Visual C++ - Win32 - Консольное приложение):
Код

void ErrorMessage(char *str)  //вывод подробной информации об ошибке
{
  LPVOID msg;
  FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // язык по умолчанию
    (LPTSTR) &msg,
    0,
    NULL
  );
MessageBox( NULL, (LPCSTR)msg, _T("LastError"), MB_OK | MB_ICONINFORMATION );

  //CharToOem((LPCSTR)lpMsgBuf,(LPSTR)lpMsgBuf);
  printf("%s: %s\n",str,msg);
  LocalFree(msg);
}


В проекте Windows Forms использую следующий код:
Код

void ErrorMessage(char *str)  //вывод подробной информации об ошибке
{
  String^ msg;
  FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // язык по умолчанию
    (LPTSTR) &msg,
    0,
    NULL);
//CharToOem((LPCSTR)msg,(LPSTR)msg);
  textBox3->Text = msg;
//MessageBox( NULL, (LPCSTR)msg, (LPCSTR)("LastError"), MB_OK | MB_ICONINFORMATION );
//MessageBox::Show(msg, "LastError", MessageBoxButtons::OK, MessageBoxIcon::Exclamation );
//printf("%s: %s\n",str,msg);
//LocalFree(msg);
}

Чтобы работал FormatMessage пришлось в свойствах проекта поменять "Поддержка среды CLR:" с \clr:pure на \clr.
Чтобы MessageBox::Show() принял 1й параметр, пришлось поменять тип LPVOID msg на String^ msg. В итоге откомпилировалось и выдает в текстбокс и в сообщение это:
Код

⻫਍꬀ꮫꮫꮫﺫﻮﻮ

Видимо надо преобразовать кодировку. CharToOem не принимает параметры типа String^. Чувствую не так это надо делать, подскажите пожалуйста как правлильно.
PM MAIL   Вверх
azesmcar
Дата 5.8.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Цитата(TheDestroyer @  5.8.2009,  15:11 Найти цитируемый пост)
1. Где лучше писать код обработчика события, например, нажатия кнопки? В открывающемся обработчике 

Там где он предлагает, а вообще - где удобно smile

Цитата(TheDestroyer @  5.8.2009,  15:11 Найти цитируемый пост)
2. Как правильно называется язык, на котором нужно писать создав такой проект? Не читый c++ же?

C++ .NET


Цитата(TheDestroyer @  5.8.2009,  15:11 Найти цитируемый пост)
3. При объявлении текстовой переменной требуется объявлять так:
Выделить всёкод C++
1:
    
String^ msg;
а не так
Выделить всёкод C++
1:
    
String msg;
Что значит знак ^?

Handle to Object on Managed Heap

Цитата(TheDestroyer @  5.8.2009,  15:11 Найти цитируемый пост)
4. Пытаюсь получить значение последней ошибки в программе с помощью GetLastError(). Взял кусок кода, который у меня работает в консольном приложении (проект Visual C++ - Win32 - Консольное приложение):

Код

Marshal::GetLastWin32Error()

Это пойдет??
PM   Вверх
TheDestroyer
Дата 5.8.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Спасибо за ответы.
Остается нерешенным 4й вопрос: нужно отобразить ошибку в читаемом виде.
Сейчас код такой:
Код

using namespace System::Runtime::InteropServices;
...
void ErrorMessage(char *str)  //вывод подробной информации об ошибке
{
  String^ msg;
  FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    Marshal::GetLastWin32Error(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // язык по умолчанию
    (LPTSTR) &msg,
    0,
    NULL);

//CharToOem((LPCSTR)msg,(LPSTR)msg);
  textBox3->Text = msg;
MessageBox::Show(msg, "LastError", MessageBoxButtons::OK, MessageBoxIcon::Exclamation );
}

Всеравно выводит квадраты и закорючки.
Все-таки, похоже, надо использовать 
Код

CharToOem((LPCSTR)msg,(LPSTR)msg);

Но в таком виде ошибка: приведение типов: невозможно преобразовать 'System::String ^' в 'LPCSTR'.
Как с объектом String^ msg сделать преобразование аналогичное в c++ msg.c_str() (перевести в const char)?
PM MAIL   Вверх
mihryak
Дата 5.8.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



Цитата(TheDestroyer @  5.8.2009,  18:12 Найти цитируемый пост)
Остается нерешенным 4й вопрос: нужно отобразить ошибку в читаемом виде.

тут всё просто - 
Код

new Win32Exception(Marshal.GetLastWin32Error()).Message

простите за шарп

Это сообщение отредактировал(а) mihryak - 5.8.2009, 22:28
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.