エディットボックスの中身をNetUserSetInfo関数に渡すには?

解決


どら  2004-11-14 01:49:55  No: 55147

本当にしつこくてごめんなさい(^^;

エディットボックスって、LPTSTR型で取得しますよね?
それに対して、NetUserSetInfoなどの関数は、LPCWSTR型でを渡さなければならないですよね?

MultiByteToWideCharをつかってもうまくいかないし・・・

#define Unicode

をしないとまずいんですかね?
何かよい方法があったら教えてください。
必要があれば、全コードを書き出します。


YuO  2004-11-14 12:31:12  No: 55148

> エディットボックスって、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した文字列も提示して下さい。
#当然再現手順(入力データ)も。


どら  2004-11-15 19:26:51  No: 55149

今までは、UserNameなどのワイド文字列を

LPCWSTR UserName = NULL;

と宣言していましたがこれを

WCHAR UserName[64];

のようにWCHAR型で宣言したところ、うまくいきました。
ついでなので質問なのですが・・・

MultiByteToWideChar関数の最後の引数を0にしたときとそうでないときなのですが・・・

MSDNなどを見ると
「lpWideCharStr が指すバッファのサイズをワイド文字数の単位で指定します。0 を指定すると、必要なバッファのサイズ(ワイド文字数)が返り、lpWideCharStr が指すバッファは使われません。」
とありますよね?

これって、基本的には0にしておいた方が無難に感じてしまうのですが、これは危険なことなのでしょうか?

今回は

sizeof(UserName)

にしていますが・・・。

とりあえず、解決はしました。
YuOさん、いつもありうがとうございます。
感謝、感謝です(^^)


瀬戸っぷ  2004-11-15 20:22:14  No: 55150

> 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);

といった感じで、動的確保する場合に使用します。


tetrapod  2004-11-15 20:25:22  No: 55151

> MultiByteToWideChar関数の最後の引数を0にしたときとそうでないときなのですが・・・

要するに2回使え、ってことですよ。
DWORD n=MultiByteToWideChar(..., 0, 0);
wchar_t* wc=new wchar_t[n];
MultiByteToWideChar(..., wc, n); // ... 部分は前回と同じにするべし
...
delete[] wc;
これだと元文字数の如何にかかわらずバッファーオーバーフローしないわけです。


どら  2004-11-16 00:03:16  No: 55152

なるほど・・・

う〜ん、本当に勉強になります。
瀬戸っぷさん、tetrapodさん、追加情報ありがとうございます!!


tetrapod  2004-11-16 17:57:54  No: 55153

ちなみに ccWideChar は「文字数」なので sizeof を渡すと誤動作しますよ。
sizeof(UserName)/sizeof(UserName[0]) のように文字数を渡してください。
こーいうバグって見つけにくいんだよね...


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加