|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.04.2008, 14:56 | #1 |
Регистрация: 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 |
29.04.2008, 15:44 | #2 |
Новичок
Джуниор
Регистрация: 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? Наверное, чтобы проще было запутаться. |
29.04.2008, 16:45 | #3 |
Регистрация: 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. |
29.04.2008, 17:19 | #4 |
Новичок
Джуниор
Регистрация: 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 Вопрос возникает часто, а повторяться не хочется. А то, что Вы привели ниже - результат включения переменных в структуру. |
29.04.2008, 17:26 | #5 |
Регистрация: 29.04.2008
Сообщений: 5
|
Спасибо за советы.
|
30.04.2008, 11:55 | #6 |
Регистрация: 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. |
30.04.2008, 13:32 | #7 |
Регистрация: 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 |
30.04.2008, 16:23 | #8 | ||||
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
Цитата:
Цитата:
Цитата:
Цитата:
И ещё, не указывайте типы символьных/строковых переменных и функций для работы с ними явно, если не знаете наверняка, что именно это и нужно в конкретном случае. Пользуйтесь макросами TEXT(), _T() и функциями-подстановками - SendMessage - вместо SendMessageA или SendMessageW, _stprintf, вместо sprintf и т.д. Практически все ошибки, которые Вы привели в этой теме - последствия явного указания символов в формате ANSI при переходе к проекту в UNICODE. |
||||
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |