Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 6
1

Конвертация const char [] в PLCWSTR

14.09.2015, 22:04. Показов 918. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, профессионалы.

Подскажите как скормить char addrStr[15] функции записи в реестр RegSetValueEx в качестве пятого параметра?

Функция имеет следующий прототип:

C++
1
2
3
4
5
6
7
8
LONG WINAPI RegSetValueEx(
  _In_             HKEY    hKey,
  _In_opt_         LPCTSTR lpValueName,
  _Reserved_       DWORD   Reserved,
  _In_             DWORD   dwType,
  _In_       const BYTE    *lpData,
  _In_             DWORD   cbData
);
Описание пятого параметра:
lpData [in]
The data to be stored.
For string-based types, such as REG_SZ, the string must be null-terminated. With the REG_MULTI_SZ data type, the string must be terminated with two null characters. String-literal values must be formatted using a backslash preceded by another backslash as an escape character. For example, specify "C:\\mydir\\myfile" to store the string "C:\mydir\myfile".
Note lpData indicating a null value is valid, however, if this is the case, cbData must be set to '0'.


Вот как примерно это выглядит в коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
...
char addrStr[15];
...
addrStr[0] = 'a';
addrStr[0] = 'b';
addrStr[0] = 'c';
...
addrStr[0] = 'n';
addrStr[0] = 'o';
...
RegSetValueEx(hKey, "CLIENTADDRESS", 0,REG_SZ, (LPBYTE)addrStr, strlen(addrStr) + 1);
...
Матюкается так: "невозможно преобразовать параметр 2 из 'const char [14]' в 'LPCWSTR'".

Помогите или на крайняк ткните носом, где почитать...

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.09.2015, 22:04
Ответы с готовыми решениями:

Чем отличаются объявления const char* и const* char
Прошу объяснить мне, чем отличаются объявления const char* и const* char и как объявить: указатель...

Error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]"
Вроде все правильно а все равно не работает. Подскажите в чем ошибка #include <iostream> ...

char operator[](unsigned short offset) const; // что означает const?
Собстенно вопрос уже озвучен :).

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *'
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context ...

12
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.09.2015, 22:14 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
...
CString addrStr;
...
addrStr[0] = _T('a');
addrStr[0] = _T('b');
addrStr[0] = _T('c');
...
addrStr[0] = _T('n');
addrStr[0] = _T('o');
...
RegSetValueEx(hKey, "CLIENTADDRESS", 0,REG_SZ, addrStr,  addrStr.GetLength() );
...
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
14.09.2015, 22:18 3
hoggy, второй параметр LPCTSTR, так что "CLIENTADDRESS" также в макрос лучше обернуть
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.09.2015, 22:19 4
Цитата Сообщение от Croessmah Посмотреть сообщение
второй параметр LPCTSTR
C++
1
2
3
4
5
6
7
8
9
10
11
12
...
CString addrStr;
...
addrStr[0] = _T('a');
addrStr[0] = _T('b');
addrStr[0] = _T('c');
...
addrStr[0] = _T('n');
addrStr[0] = _T('o');
...
RegSetValueEx(hKey, _T("CLIENTADDRESS"), 0,REG_SZ, addrStr,  addrStr.GetLength() );
...
0
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 6
15.09.2015, 09:42  [ТС] 5
Спасибо за оперативный отклик.

Я прекрасно понимаю, что вопросы до боли нубские задаю, но все же спрошу. Как добавить поддержку CString в мой проект? Дело в том, что проект консольный, без MFC и ATL, следовательно инклуд хедера CString.h не оказывает желаемого результата - "Не удается открыть файл include: CString.h: No such file or directory". Да и не хотелось сюда MFC вмешивать, так как экзешник требуется статически линкованый сделать, а c MFC он будет весить как слов.

Есть еще варианты?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
15.09.2015, 10:05 6
Используй тип TCHAR вместо char (это макрос: в юникоде wchar_t в мультибайтовой char), при заполнении массива символов ставь в конце нуль-символ ('\0' или просто 0).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <tchar.h>
...
TCHAR addrStr[15];
...
addrStr[0] = 'a';
addrStr[1] = 'b';
addrStr[2] = 'c';
...
addrStr[3] = 'n';
addrStr[4] = 'o';
...
addrStr[14] = 0;
...
RegSetValueEx(hKey, _T("CLIENTADDRESS"), 0,REG_SZ, addrStr, strlen(addrStr) + 1);
...
LPCTSTR = const TCHAR* (long point const str). "T" означает что тип определяется в зависимости от настроек проекта (юникод (wchar_t) или мультибайт(char) кодировка). RegSetValueEx(...) тоже макрос: в юникоде это будет RegSetValueExW, а мультибайт RegSetValueExA.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.09.2015, 10:05 7
Цитата Сообщение от mightyman Посмотреть сообщение
Есть еще варианты?
Используй функцию RegSetValueExA.
0
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 6
15.09.2015, 11:48  [ТС] 8
Кстати, кто-нибудь в курсе, как установить переменную среды не для процесса, а как бы глобально, чтобы можно было по закрытию процесса обратиться к это переменной?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.09.2015, 11:54 9
Свойства "Мой Компьютер"/"Этот Компьютер" -> "Дополнительные параметры системы" -> "Переменные среды".
0
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 6
15.09.2015, 16:34  [ТС] 10
castaway, да, это правильно, но меня интересует программный вариант. Есть целый ряд функций, которые устанавливают переменные среды, но это только для процесса в котором вызывается функция. А мне бы так, что после завершения процесса была возможность обратиться к этой переменной.

С RegSetValueEx так ничего и не выходит. Заменил "char addrStr[15];" на "TCHAR addrStr[15];", но RegSetValueEx не умолима - "error C2664: strlen: невозможно преобразовать параметр 1 из 'TCHAR [15]' в 'const char *'".

Все же как из "TCHAR [15]" сделать "const char *"?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
15.09.2015, 16:37 11
mightyman, _tcslen вместо strlen
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.09.2015, 16:42 12
mightyman,
Calling SetEnvironmentVariable has no effect on the system environment variables. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE message with lParam set to the string "Environment". This allows applications, such as the shell, to pick up your updates.
MSDN
0
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 6
16.09.2015, 09:33  [ТС] 13
Вопрос решен. Всем спасибо, ребята!!!
0
16.09.2015, 09:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2015, 09:33
Помогаю со студенческими работами здесь

Ошибка "значение типа "const char [81]" нельзя использовать для инициализации сущности типа "const unsigned char [61]"
Прошу помощи, так как раньше прога работала, сейчас решил вернуться и выдает ошибку: #pragma once...

Cannot convert 'const wchar_t *' to 'const char *'
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *'
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void...

Проблема с несовместимостью типов параметров char, const char, STRSAFE_LPWSTR, STRSAFE_LPCWSTR
Проблемные вопросы отражены на скрине Программа написана к заданию: 1. Разработать прикладной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru