2017-09-20 12 views
0
LPWSTR data[256]; 
ToUnicode(vk_code, 0, 0, *data, 256, 0); 

このコードは、次の例外がスローされます。WinApi - ToUnicode関数がアクセス違反をスローしますか?

Access violation writing location 0xCCCCCCCC.

vk_code値は、ブレークポイントで完全に正常であるように見えた、と私は私の引数が有効であったことを確認するために、MSDNで確認しました。私は何が間違っていますか?

+2

それが正しく、WindowsのAPIを手探りしようとする前に、配列とポインタについての学習の価値があります。あなたは初期化されていないポインタを与えています。 – chris

+0

@chris '0xCCCCCCCC'アドレスを調べると、初期化されていない値をデバッグするのに使用されるメモリ位置になります。 –

+0

これは間違っています。 「アドレス」「0xCCCCCCCC」は意味を持たない。 '0xCC'は、デバッグ設定で初期化されていない変数を初期化するためのパターンです。デバッグ中に初期化されていない変数を簡単に見つけ出すのに役立ちます。しかし、その実際の価値は興味深いものではありません。 '* data'の代わりに' nullptr'を渡すときと全く同じ例外があります。 – IInspectable

答えて

1

パラメータpwszBuffに初期化されていないポインタを渡しています。割り当てられた文字配列へのポインタが必要です。 WCHAR要素の代わりに、LPWSTR要素を使用するように配列を変更し、*間接参照演算子を取り除く:

WCHAR data[256]; 
int res = ToUnicode(vk_code, 0, 0, data, 256, 0); 
switch (res) { 
    case -1: 
     // dead-key character, nothing written to data[]... 
     break; 
    case 0: 
     // no translation, nothing written to data[]... 
     break; 
    default: 
     // res # of characters written to data[]... 
     break; 
} 
関連する問題