Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка приведения типа строки / 23 сообщений из 23, страница 1 из 1
20.07.2017, 10:13
    #39492090
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Есть такой пример, взятый из этого же форума, правда, многолетней давности:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <tlhelp32.h>
//---------------------------------------------------------------------------
bool IsProcessRun( const char * const processName )
{
   HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

   PROCESSENTRY32 pe;
   pe.dwSize = sizeof( PROCESSENTRY32 );
   Process32First( hSnapshot, &pe );

   while( 1 ) {
       if( strcmp( pe.szExeFile, processName ) == 0 ) return true;
       if( !Process32Next( hShapshot, &pe ) ) return false;
   }
}



Пытаюсь скомпилировать его в VS 2008 и получаю такую ошибку:

Код: plaintext
1.
1>c:\...\processlisttest\processlisttest\processlisttest.cpp(19) : error C2664:  strcmp: невозможно преобразовать параметр 1 из 'WCHAR [260]' в 'const char *' 
1>        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции

Попробовал использовать reinterpret_cast:
Код: plaintext
1.
strcmr( reinterpret_cast<const char*>(pe.szExeFile), processName )



Но reinterpert_cast<const char*>(pe.szExeFile) возвращает только первый символ pe.szExeFile, естественно, это не то, что мне нужно.

Как решить проблему?
...
Рейтинг: 0 / 0
20.07.2017, 10:19
    #39492095
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
AbejonКак решить проблему?варианты:
- пересобрать всё без использования юникода
- WideCharToMutlyByte или в обратную сторону
...
Рейтинг: 0 / 0
20.07.2017, 10:43
    #39492119
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
CEMb- пересобрать всё без использования юникода
А как это сделать? Сейчас файлы сохранены в кодировке Windows-1251
...
Рейтинг: 0 / 0
20.07.2017, 10:59
    #39492141
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Открой для себя свойства проекта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.07.2017, 11:06
    #39492152
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Тебе надо в проекте указать "Use multibyte character set" вместо "Use unicode",
в деталях это должно повлечь за собой определение макроса MBCS вместо UNICODE.

было

-DUNICODE

должно стать

-DMBCS

Затем нужно весь проект очистить и собрать заново, перекомпилировать и перелинковать.
...
Рейтинг: 0 / 0
20.07.2017, 11:10
    #39492161
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Да, это всё, конечно, если ты НЕ собираешься использовать UNICODE, максимум -- кодировки типа cp1251.

Кроме этого, хорошо бы использовать character mapping везде в программе.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <tchar.h>
#include <tlhelp32.h>

bool IsProcessRun( LPCTSTR processName )
{
   HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

   PROCESSENTRY32 pe;
   pe.dwSize = sizeof( PROCESSENTRY32 );
   Process32First( hSnapshot, &pe );

   while( 1 ) {
       if( !_tcscmp( pe.szExeFile, processName ) ) return true;
       if( !Process32Next( hShapshot, &pe ) ) return false;
   }
}
...
Рейтинг: 0 / 0
20.07.2017, 11:55
    #39492210
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
MasterZivТебе надо в проекте указать "Use multibyte character set" вместо "Use unicode",
...
Затем нужно весь проект очистить и собрать заново, перекомпилировать и перелинковать.
Тогда появляется куча ошибок в других частях проекта.
...
Рейтинг: 0 / 0
20.07.2017, 12:00
    #39492219
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
AbejonТогда появляется куча ошибок в других частях проекта.->MasterZiv
Код: plaintext
1.
2.
3.
4.
#include <tchar.h>
//...
       if( !_tcscmp //....
//...
...
Рейтинг: 0 / 0
20.07.2017, 12:30
    #39492253
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
CEMbAbejonТогда появляется куча ошибок в других частях проекта.->MasterZiv
Код: plaintext
1.
2.
3.
4.
#include <tchar.h>
//...
       if( !_tcscmp //....
//...



Тогда я получаю такую ошибку:

1>c:\users\администратор\documents\visual studio 2008\projects\processlisttest\processlisttest\processlisttest\processlisttest.cpp(19) : error C2664: wcscmp: невозможно преобразовать параметр 2 из 'const char *const ' в 'const wchar_t *'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции

Если же я указываю тип входного параметра const wchar_t * const, то получаю такое сообщение об ошибке:

1>c:\users\администратор\documents\visual studio 2008\projects\processlisttest\processlisttest\processlisttest\processlisttest.cpp(34) : error C2664: IsProcessRun: невозможно преобразовать параметр 1 из 'const char [11]' в 'const wchar_t *const '
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
...
Рейтинг: 0 / 0
20.07.2017, 12:41
    #39492267
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Abejonневозможно преобразовать параметр 1 из 'const char [11]' в 'const wchar_t *const

RTFM wide string literal
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.07.2017, 12:47
    #39492275
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
AbejonТогда я получаю такую ошибку:
Код: plaintext
1.
bool IsProcessRun( const char * const processName )

->
Код: plaintext
1.
bool IsProcessRun( const TCHAR* const processName )
...
Рейтинг: 0 / 0
20.07.2017, 12:48
    #39492278
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Выше уже писали 20660476
Еще раз спрошу: ты юникодный проект умышленно используешь или только потому что MSVC такой создает по-умолчанию?

Если второе, то в свойствах проекта переключи General - Charaster set = Not set
и твой исходный код скомпилируется как есть.
...
Рейтинг: 0 / 0
20.07.2017, 12:53
    #39492284
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Dima TВыше уже писали 20660476
Еще раз спрошу: ты юникодный проект умышленно используешь или только потому что MSVC такой создает по-умолчанию?

Если второе, то в свойствах проекта переключи General - Charaster set = Not set
и твой исходный код скомпилируется как есть.

Проект мне такой достался. В конфиге указано использование юникода. Мне этот проект нужно доработать.
...
Рейтинг: 0 / 0
20.07.2017, 12:56
    #39492289
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
CEMbAbejonТогда я получаю такую ошибку:
Код: plaintext
1.
bool IsProcessRun( const char * const processName )

->
Код: plaintext
1.
bool IsProcessRun( const TCHAR* const processName )



Получаю такую ошибку:

1>c:\users\администратор\documents\visual studio 2008\projects\processlisttest\processlisttest\processlisttest\processlisttest.cpp(34) : error C2664: IsProcessRun: невозможно преобразовать параметр 1 из 'const char [11]' в 'const TCHAR *const '
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции


Т.е. проблема в том, что получаются разные типы у первого и второго параметра, я так понимаю. Как их привести к одному типу?
...
Рейтинг: 0 / 0
20.07.2017, 12:59
    #39492296
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Dimitry SibiryakovAbejonневозможно преобразовать параметр 1 из 'const char [11]' в 'const wchar_t *const

RTFM wide string literal


И что с этим делать? Посмотрел MSDN на эту тему. Честно сказать, ничего не понял.
...
Рейтинг: 0 / 0
20.07.2017, 13:07
    #39492311
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
AbejonКак их привести к одному типу?везде заменить char на TCHAR
TCHAR и _tsc-функции - это макросы, которые в зависимости от unicode/mulibyte разворачиваются в соответствующие типы и функции и освобождают от забот по переходу всего кода с/на юникод
...
Рейтинг: 0 / 0
20.07.2017, 13:11
    #39492315
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
AbejonCEMbпропущено...
Код: plaintext
1.
bool IsProcessRun( const char * const processName )

->
Код: plaintext
1.
bool IsProcessRun( const TCHAR* const processName )



Получаю такую ошибку:

1>c:\users\администратор\documents\visual studio 2008\projects\processlisttest\processlisttest\processlisttest\processlisttest.cpp(34) : error C2664: IsProcessRun: невозможно преобразовать параметр 1 из 'const char [11]' в 'const TCHAR *const '
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции


Т.е. проблема в том, что получаются разные типы у первого и второго параметра, я так понимаю. Как их привести к одному типу?
Ты как вызываешь IsProcessRun() ?
Если
Код: plaintext
1.
IsProcessRun("my.exe")


то добавь
Код: plaintext
1.
IsProcessRun(L"my.exe")
...
Рейтинг: 0 / 0
20.07.2017, 13:20
    #39492324
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Dima T,
Спасибо, друже!

Вот это:

Dima T
Код: plaintext
1.
IsProcessRun(L"my.exe")




сработало!
...
Рейтинг: 0 / 0
20.07.2017, 13:22
    #39492328
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Dima Tто добавь
Код: plaintext
1.
IsProcessRun(L"my.exe")

А, да, точно! Все константы надо заменить c "some" на _T("some") или, если не лень, на более универсальную TEXT("some")
...
Рейтинг: 0 / 0
20.07.2017, 13:24
    #39492329
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
Dima T,
Вот такой вариант рабочий:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
bool IsProcessRun( const WCHAR* processName )
{
   HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   PROCESSENTRY32 pe;
   pe.dwSize = sizeof(PROCESSENTRY32);
   Process32First(hSnapshot, &pe);

   while( 1 ) {
	   //char* szFileName = (char*)(pe.szExeFile);
	   if(_tcscmp(pe.szExeFile, processName) == 0) return true;
       if(!Process32Next(hSnapshot, &pe)) return false;
   }
}



И вызывать нужно вот так:

Код: plaintext
1.
IsProcessRun(L"my.exe" );



Всем большое спасибо!
...
Рейтинг: 0 / 0
20.07.2017, 14:25
    #39492400
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
AbejonMasterZivТебе надо в проекте указать "Use multibyte character set" вместо "Use unicode",
...
Затем нужно весь проект очистить и собрать заново, перекомпилировать и перелинковать.
Тогда появляется куча ошибок в других частях проекта.


Ну и чего, предлагаешь нам все их исправлять ?

Учить программировать, читай книги, читай документацию, исправляй...
...
Рейтинг: 0 / 0
20.07.2017, 14:27
    #39492402
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
AbejonТ.е. проблема в том, что получаются разные типы у первого и второго параметра, я так понимаю. Как их привести к одному типу?

Прежде всего, тебе нужно ИСПОЛЬЗОВАТЬ везде ОДИН И ТОТ ЖЕ ТИП.

Я тебе уже писал, везеде TCHAR и производные от него типы.
...
Рейтинг: 0 / 0
20.07.2017, 14:30
    #39492403
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка приведения типа строки
AbejonDima T,
Спасибо, друже!

Вот это:

Dima T
Код: plaintext
1.
IsProcessRun(L"my.exe")




сработало!

Если учесть, что вроде бы как мы хотим наоборот перейти с UNICODE на MBCS, то это -- не совет, а медвежья услуга.

В любом случае, UNICODE или MBCS, НЕ ДОЛЖНО БЫТЬ в коде явных литералов строк с или без L"", все должны быть _T().
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка приведения типа строки / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]