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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2009, 22:47   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию Имя пользователя задано неверно. (NetUserAdd)

добрый день, вот получился маленький косячок. вот код:
Код:
int addUser(TCHAR *mes)
{
	DWORD	dwError = 0;
	NET_API_STATUS nStatus;
	USER_INFO_1 ui;
	ui.usri1_name =	(unsigned short *)mes;
	ui.usri1_password = NULL;
	ui.usri1_priv = 1;
	ui.usri1_home_dir = NULL;
	ui.usri1_comment = NULL;
	ui.usri1_flags = UF_SCRIPT;
	ui.usri1_script_path = NULL;
	nStatus = NetUserAdd(NULL,1,(LPBYTE)&ui,&dwError);
	if(nStatus)
	{
		printf("Error NetUserAdd(): %d", nStatus);
	}
	return 1;
}
при таком раскладе, мне пишут что пользователь задан неверно, а при таком раскладе:
Код:
int addUser(TCHAR *mes)
{
	DWORD	dwError = 0;
	NET_API_STATUS nStatus;
	USER_INFO_1 ui;
	ui.usri1_name =	L"prog";
	ui.usri1_password = NULL;
	ui.usri1_priv = 1;
	ui.usri1_home_dir = NULL;
	ui.usri1_comment = NULL;
	ui.usri1_flags =	UF_SCRIPT;
	ui.usri1_script_path = NULL;
	nStatus = NetUserAdd(NULL,1,(LPBYTE)&ui,&dwError);
	if(nStatus)
	{
		printf("Error NetUserAdd(): %d", nStatus);
	}
	return 1;
}
все нормально, добавляет пользователя, но мне нужен 1 вариант,я должен ввести имя пользователя добавляемого и он должен добавиться, спасибо за внимание.
Olejik вне форума Ответить с цитированием
Старый 21.12.2009, 23:01   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как говорится в msdn вам нужно не TCHAR а WCHAR то есть строго юникод.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.12.2009, 23:16   #3
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

а вот с юникодами я не силен, у меня только один вариант в голове крутится:
Код:
int addUser(TCHAR *mes)
{
	DWORD	dwError = 0;
	NET_API_STATUS nStatus;
	USER_INFO_1 ui;
	ui.usri1_name = (WCHAR *)mes;
	ui.usri1_password = NULL;
	ui.usri1_priv = 1;
	ui.usri1_home_dir = NULL;
	ui.usri1_comment = NULL;
	ui.usri1_flags = UF_SCRIPT;
	ui.usri1_script_path = NULL;
	nStatus = NetUserAdd(NULL,1,(LPBYTE)&ui,&dwError);
	if(nStatus)
	{
		printf("Error NetUserAdd(): %d", nStatus);
	}
	return 1;
}
Olejik вне форума Ответить с цитированием
Старый 21.12.2009, 23:31   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
int addUser(WCHAR *mes)
{
	DWORD	dwError = 0;
	NET_API_STATUS nStatus;
	USER_INFO_1 ui;
	ui.usri1_name = mes;
	ui.usri1_password = NULL;
	ui.usri1_priv = 1;
	ui.usri1_home_dir = NULL;
	ui.usri1_comment = NULL;
	ui.usri1_flags = UF_SCRIPT;
	ui.usri1_script_path = NULL;
	nStatus = NetUserAdd(NULL,1,(LPBYTE)&ui,&dwError);
	if(nStatus)
	{
		printf("Error NetUserAdd(): %d", nStatus);
	}
	return 1;
}
а может так?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2009, 00:49   #5
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

так,ладно, спасибо за инфу, но у меня есть вопросик, просто я в cpp файле разбираю строку типа char и передаю функции char, как можно из этого выкрутиться?
Код:
char *trash;
.
.
.
if(strcmp(trash,"adduser") == NULL)
{
	trash = strtok(NULL," ");
	addUser(trash);
	continue;
}
Olejik вне форума Ответить с цитированием
Старый 22.12.2009, 00:55   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
MultiByteToWideChar
поидее поможет(параметры в msdn)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2009, 11:34   #7
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

получилось, спасибо!! )
Код:
int addUser(TCHAR *mes)
{
	DWORD					dwError = 0;
	NET_API_STATUS			nStatus;
	USER_INFO_1				ui;
	WCHAR					name[20];
	MultiByteToWideChar( CP_ACP,0,mes,strlen(mes)+1,name,sizeof(name)/sizeof(name[0]));
	ui.usri1_name =			name;//L"prog";
	ui.usri1_password =		NULL;
	ui.usri1_priv =			1;
	ui.usri1_home_dir =		NULL;
	ui.usri1_comment =		NULL;
	ui.usri1_flags =		UF_SCRIPT;
	ui.usri1_script_path =	NULL;
	nStatus = NetUserAdd(NULL,1,(LPBYTE)&ui,&dwError);
	if(nStatus)
	{
		printf("Error NetUserAdd(): %d", nStatus);
	}
	return 1;
}
Olejik вне форума Ответить с цитированием
Старый 22.12.2009, 17:58   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

аккуратнее со случаями когда TCHAR=WCHAR а не char как одидает функа
советую сделать две версии функции(если lib/cpp пишете) и тогда в хидере к либе через
Код:
#ifdef UNICODE 
#define addUser addUserW
#else
#define addUser addUserA
#endif
определите какая из двух(A или W) версий будет просто без префикса

ну и соответственно код
Код:
int addUserA(char *mes)
{
	DWORD					dwError = 0;
	NET_API_STATUS			nStatus;
	USER_INFO_1				ui;
	WCHAR					name[20];
           name[19]=0;//последний символ делаем нулем
	MultiByteToWideChar( CP_ACP,0,mes,-1/*тут поставим -1...так как строка должна быть нуль терминальной*/,name,19/*поидее 19 так как 20-ый символ под 0 идет и советую вручную его нулем делать*/);
	ui.usri1_name =			name;//L"prog";
	ui.usri1_password =		NULL;
	ui.usri1_priv =			1;
	ui.usri1_home_dir =		NULL;
	ui.usri1_comment =		NULL;
	ui.usri1_flags =		UF_SCRIPT;
	ui.usri1_script_path =	NULL;
	nStatus = NetUserAdd(NULL,1,(LPBYTE)&ui,&dwError);
	if(nStatus)
	{
		printf("Error NetUserAdd(): %d", nStatus);
                      return 0;//тоже советую:)
	}
	return 1;
}

int addUserW(WCHAR *mes)
{
	DWORD	dwError = 0;
	NET_API_STATUS nStatus;
	USER_INFO_1 ui;
	ui.usri1_name = mes;
	ui.usri1_password = NULL;
	ui.usri1_priv = 1;
	ui.usri1_home_dir = NULL;
	ui.usri1_comment = NULL;
	ui.usri1_flags = UF_SCRIPT;
	ui.usri1_script_path = NULL;
	nStatus = NetUserAdd(NULL,1,(LPBYTE)&ui,&dwError);
	if(nStatus)
	{
		printf("Error NetUserAdd(): %d", nStatus);
                      return 0;//тоже советую:)
	}
	return 1;
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2009, 23:50   #9
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

спасибо за подсказку со случаями, буду мутить, а то почему то пропустили в универе на счет этого, приходится в msdn капаться
Olejik вне форума Ответить с цитированием
Старый 22.12.2009, 23:59   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в студии многое зависит от настроек проекта.
лично я никогда не использую tchar а сам явно указываю A/char или W/WCHAR.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имя пользователя Kreadlling Общие вопросы C/C++ 1 04.12.2009 14:31
Как узнать имя залогинившегося пользователя? Stilet JavaScript, Ajax 5 13.08.2009 23:02
имя пользователя и пароль к бд Roof PHP 4 26.11.2008 16:51
Спросить у пользователя его имя snake-as Общие вопросы Delphi 7 21.05.2008 20:02
Имя пользователя Albenous Win Api 3 20.01.2007 22:39