Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2008, 14:56   #1
IP_Sergik
 
Регистрация: 29.04.2008
Сообщений: 5
По умолчанию Трудности перевода проекта с С на Visual Studio 2005 С++

Появилась необходимость перевести проект с С на Visual Studio 2005 С++...
Появились непонятные ошибки. Если что - не судите строго за возможную простоту их решения (давно уже это было... вот сейчас восстанавливаю забытые знания да и с Visual Studio 2005 не знаком).

Ошибки:
wc.lpszClassName = "Freel"; - error C2440: '=' : cannot convert from 'const char [9]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

if (!TranslateAccelerator(hwndDlg,hAcc elTable,&msg)) - cannot convert parameter 2 from 'HANDLE' to 'HACCEL'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast

hMenu = GetSubMenu (hMenu, 0) ; - cannot convert parameter 1 from 'HWND' to 'HMENU'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
IP_Sergik вне форума Ответить с цитированием
Старый 29.04.2008, 15:44   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Во-первых, при чём здесь .NET?
Во-вторых, объясните, как именно Вы переводите проект? Пока всё выглядит так, будто Вы загнали текст на C под WinAPI в проект MFC.
В-третьих, ничего загадочного в этих ошибках нет:
1 - попытка преобразования ANSI-строки в UNICODE-строку, с самых давних времён крайне желательно замыкать текст в макросы TEXT() или _T().
2 - посмотрите на макрос DECLARE_HANDLE и всё увидите. Или приводите типы явно, или поменяйте определение hAccelTable на HACCEL. C++ - язык с типизацией "средней строгости". Может быть, смотря что за проект, проще компилировать его как C, а не как C++.
3 - то же самое. С чего бы переменной hMenu давать тип HWND? Наверное, чтобы проще было запутаться.
B_N вне форума Ответить с цитированием
Старый 29.04.2008, 16:45   #3
IP_Sergik
 
Регистрация: 29.04.2008
Сообщений: 5
По умолчанию

За то, что создал топик не в том разделе, прошу прощения...впредь буду внимательней.

Как перевожу - вы сказали почти правильно... перегнал все файлы в Win32 Project. Хотя уже понимаю что это не так просто, как казалось.
(Препод требует чтобы проект был написан в среде Microsoft Visual Studio 2005)

Осмелюсь задать еще один, банальный скорей всего, вопрос:
Все переменные объявляются блоком:
HINSTANCE hinst;
HICON hIconCalc;
NOTIFYICONDATA tnid;
HWND hwndDlg;
MSG msg;
HACCEL hAccelTable;
HMENU hMenu;
LRESULT r;
HGLOBAL hglbCopy;
LPTSTR strCopy;

Возникает куча ошибок: error C2664: cannot convert parameter 1 from 'char[] to 'LPWSTR' ('LPCWSTR')

Если же этот блок заключить в стуктуру:
typedef struct tagWNDCLASS{
}WNDCLASS,
то большинство ошибок пропадает...остаются только ошибки на строки:

} WNDCLASS; - error C2371: 'WNDCLASS' : redefinition; different basic types
и
hIconCalc=LoadIcon(hinst, TEXT("calc"));
hAccelTable = LoadAccelerators(hinst,MAKEINTRESOU RCE(IDACCEL));
hwndDlg=CreateDialog(hinst, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, (DLGPROC)DialogFunc);
while (GetMessage(&msg,NULL,0,0))
и все ошибки одинаковы: undeclared identifier hIconCalc, hAccelTable, hwndDlg, msg.
Плиз, объясни мне, дураку...(выслушаю любую критику)
Спасибо.

Последний раз редактировалось IP_Sergik; 29.04.2008 в 16:50.
IP_Sergik вне форума Ответить с цитированием
Старый 29.04.2008, 17:19   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

У Вас большинство ошибок из-за того, что Вы путаете между собой ANSI и UNICODE. Посмотрите вот это:
http://programmersforum.ru/showpost....00&postcount=6
http://programmersforum.ru/showthread.php?t=17434
http://programmersforum.ru/showthrea...t=15906&page=2
Вопрос возникает часто, а повторяться не хочется. А то, что Вы привели ниже - результат включения переменных в структуру.
B_N вне форума Ответить с цитированием
Старый 29.04.2008, 17:26   #5
IP_Sergik
 
Регистрация: 29.04.2008
Сообщений: 5
По умолчанию

Спасибо за советы.
IP_Sergik вне форума Ответить с цитированием
Старый 30.04.2008, 11:55   #6
IP_Sergik
 
Регистрация: 29.04.2008
Сообщений: 5
По умолчанию

2 B_N

Извини за настойчивость и глупость....
Покажи на примере указанных переменных (hIconCalc, hAccelTable, hwndDlg, msg). как их нужно объявить и как их использовать в:
hIconCalc=LoadIcon(hinst, TEXT("calc"));
hAccelTable = LoadAccelerators(hinst,MAKEINTRESOU RCE(IDACCEL));
hwndDlg=CreateDialog(hinst, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, (DLGPROC)DialogFunc);
while (GetMessage(&msg,NULL,0,0))
и я от тебя отстану...

Вот приведу полностью текст функции WinMain:
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
memset(&wc,0,sizeof(wc));
wc.lpfnWndProc = DefDlgProc;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hinst;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszClassName = TEXT("Freecalc");
RegisterClass(&wc);

hIconCalc=LoadIcon(hinst, TEXT("calc"));
hAccelTable = LoadAccelerators(hinst,MAKEINTRESOU RCE(IDACCEL));
hwndDlg=CreateDialog(hinst, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, (DLGPROC)DialogFunc);

while (GetMessage(&msg,NULL,0,0))
{
if (!TranslateAccelerator(hwndDlg,hAcc elTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return msg.wParam;

}

Последний раз редактировалось IP_Sergik; 30.04.2008 в 12:01.
IP_Sergik вне форума Ответить с цитированием
Старый 30.04.2008, 13:32   #7
IP_Sergik
 
Регистрация: 29.04.2008
Сообщений: 5
По умолчанию

Все с несоответствием типов разобрался (хотя может и неправильно):
wsprintf(LPWSTR(IniFileName),LPCWST R("%s\\freecalc.ini"),LPWSTR(IniFil eName)); - это правильно...?
при компиляции выдает только 3 предупреждения и одну ошибку на строки:
1. return msg.wParam; - warning C4244: conversion from 'WPARAM' to 'int', possible loss of data

2. wsprintf(LPWSTR(sxPos),LPCWSTR("%i" ),LPWSTR(wPos.left)); - warning C4312: '<function-style-cast>' : conversion from 'LONG' to 'LPWSTR' of greater size

3. sprintf(data,"%.12g",result); - warning C4996: 'sprintf' was declared deprecated
4 на конец кода: - error C2857: '#include' statement specified with the /Ycstdafx.h command-line option was not found in the source file
IP_Sergik вне форума Ответить с цитированием
Старый 30.04.2008, 16:23   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от IP_Sergik Посмотреть сообщение
wsprintf(LPWSTR(IniFileName),LPCWST R("%s\\freecalc.ini"),LPWSTR(IniFil eName)); - это правильно...?
Нет. неправильно. Что именно кастается в первом и третьем случаях мне не видно - как именно объявлена IniFileName? Она должна быть, по логике вещей, либо LP[C]WSTR (а лучше LP[C]TSTR), либо WCHAR IniFileName[] = L"abcde" (лучше TCHAR IniFileName[] = TEXT("abcde"); - но во втором случае Вы просто приводите указатель char* к указателю short*, а не преобразуете строку в юникод. При компиляции ошибок не будет, но в рантайме это точно добром не кончится.


Цитата:
Сообщение от IP_Sergik Посмотреть сообщение
при компиляции выдает только 3 предупреждения и одну ошибку на строки:
1. return msg.wParam; - warning C4244: conversion from 'WPARAM' to 'int', possible loss of data
Это не ошибка, а предупреждение. Смысл его в том, что битовые размеры WPARAM и int различны и будет выполняться усечение результата. Последствия этого зависят от того, что это за функция.

Цитата:
Сообщение от IP_Sergik Посмотреть сообщение
2. wsprintf(LPWSTR(sxPos),LPCWSTR("%i" ),LPWSTR(wPos.left)); - warning C4312: '<function-style-cast>' : conversion from 'LONG' to 'LPWSTR' of greater size
А зачем, действительно, Вы приводите целое число, которое собираетесь выводить как "%i" к строке???

Цитата:
Сообщение от IP_Sergik Посмотреть сообщение
3. sprintf(data,"%.12g",result); - warning C4996: 'sprintf' was declared deprecated
4 на конец кода: - error C2857: '#include' statement specified with the /Ycstdafx.h command-line option was not found in the source file
Везде был wsprintf, а здесь вдруг sprintf??? Зачем?

И ещё, не указывайте типы символьных/строковых переменных и функций для работы с ними явно, если не знаете наверняка, что именно это и нужно в конкретном случае. Пользуйтесь макросами TEXT(), _T() и функциями-подстановками - SendMessage - вместо SendMessageA или SendMessageW, _stprintf, вместо sprintf и т.д. Практически все ошибки, которые Вы привели в этой теме - последствия явного указания символов в формате ANSI при переходе к проекту в UNICODE.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual Studio 2005 amelie Win Api 19 06.09.2008 12:40
visual studio.net 2005 zub Помощь студентам 1 11.03.2008 07:29
Помогите с Visual Studio 2005 Поночка Visual C++ 1 08.03.2008 15:34
Visual studio 2005 и C++ oleg kutkov Visual C++ 7 09.01.2008 20:18
visual studio 2005 }{@KeRnutyi Свободное общение 1 30.10.2007 15:36