本当にしつこくてごめんなさい(^^;
エディットボックスって、LPTSTR型で取得しますよね?
それに対して、NetUserSetInfoなどの関数は、LPCWSTR型でを渡さなければならないですよね?
MultiByteToWideCharをつかってもうまくいかないし・・・
#define Unicode
をしないとまずいんですかね?
何かよい方法があったら教えてください。
必要があれば、全コードを書き出します。
> エディットボックスって、LPTSTR型で取得しますよね?
意味不明ですが……。何を取得するのでしょうか?
文字列だとたぶんEDITコントロールが表示している文字列のことでしょうか。
それであれば,この質問に関する回答はYesです。
> それに対して、NetUserSetInfoなどの関数は、LPCWSTR型でを渡さなければならないですよね?
servernameやusernameといった引数は確かにLPCWSTR型です。
> MultiByteToWideCharをつかってもうまくいかないし・・・
うまくいかない,とは?
そもそも,
LPCTSTR user; // 入力となるユーザー名の文字列
WCHAR userName[UN_LEN + 1]; // Unicodeにおけるユーザー名の表記
#ifdef UNICODE
lstrcpyn(userName, user, sizeof(userName) / sizeof(userName[0]));
#else
MultiByteToWideChar(CP_ACP, 0, user, -1, userName, UN_LEN + 1);
#endif
のように,#ifを使ってlstrcpynWとMultiByteToWideCharを振り分ける必要があります。
> 必要があれば、全コードを書き出します。
全コードは要りません。読む気をなくすだけです。
質問の内容に関係する,必要十分な最低限のコードを提示して下さい。
ちなみに,APIがエラーを返す場合は,
GetLastError等によるエラーコードとFormatMessageした文字列も提示して下さい。
#当然再現手順(入力データ)も。
今までは、UserNameなどのワイド文字列を
LPCWSTR UserName = NULL;
と宣言していましたがこれを
WCHAR UserName[64];
のようにWCHAR型で宣言したところ、うまくいきました。
ついでなので質問なのですが・・・
MultiByteToWideChar関数の最後の引数を0にしたときとそうでないときなのですが・・・
MSDNなどを見ると
「lpWideCharStr が指すバッファのサイズをワイド文字数の単位で指定します。0 を指定すると、必要なバッファのサイズ(ワイド文字数)が返り、lpWideCharStr が指すバッファは使われません。」
とありますよね?
これって、基本的には0にしておいた方が無難に感じてしまうのですが、これは危険なことなのでしょうか?
今回は
sizeof(UserName)
にしていますが・・・。
とりあえず、解決はしました。
YuOさん、いつもありうがとうございます。
感謝、感謝です(^^)
> MSDNなどを見ると
> 「lpWideCharStr が指すバッファのサイズをワイド文字数の単位で指定します。0 を指定すると、必要なバッファのサイズ(ワイド文字数)が返り、lpWideCharStr が指すバッファは使われません。」
> とありますよね?
> これって、基本的には0にしておいた方が無難に感じてしまうのですが、これは危険なことなのでしょうか?
良く読んで下さい。
0を指定すると、「lpWideCharStr が指すバッファは使われません。」=「変換は行われません。」です。
YuOさんの例で行くと…
int iLen;
LPWSTR lpUserName;
iLen = MultiByteToWideChar(CP_ACP, 0, user, -1, NULL, 0);
lpUserName = (LPWSTR)malloc((sizeof(WCHAR)*(iLen + 1)));
MultiByteToWideChar(CP_ACP, 0, user, -1, lpUserName, iLen);
といった感じで、動的確保する場合に使用します。
> MultiByteToWideChar関数の最後の引数を0にしたときとそうでないときなのですが・・・
要するに2回使え、ってことですよ。
DWORD n=MultiByteToWideChar(..., 0, 0);
wchar_t* wc=new wchar_t[n];
MultiByteToWideChar(..., wc, n); // ... 部分は前回と同じにするべし
...
delete[] wc;
これだと元文字数の如何にかかわらずバッファーオーバーフローしないわけです。
なるほど・・・
う〜ん、本当に勉強になります。
瀬戸っぷさん、tetrapodさん、追加情報ありがとうございます!!
ちなみに ccWideChar は「文字数」なので sizeof を渡すと誤動作しますよ。
sizeof(UserName)/sizeof(UserName[0]) のように文字数を渡してください。
こーいうバグって見つけにくいんだよね...
ツイート | ![]() |