2011-06-27 18 views
0

現在、8ビットASCIIモードでテキストファイルから文字列を読み込み、その文字列をwchar_tに割り当てる関数を作成しています。*0xC0000005:アクセス違反の読み取り場所0x00200074;関数から復帰するときに発生する

ここでは私が使用しています文字列をwstringに変換するには、atlconv.hおよびUSES_CONVERSIONマクロを使用します。コードは次のとおりです。

void CSampleProvider::getCopy(CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR *a, const string s) { 
    USES_CONVERSION; 
    wstring temp(A2W (s.c_str())); 
    a->pszLabel = new WCHAR(temp.length()+1); 
    if (!a->pszLabel) 
     return; 
    wcscpy_s(a->pszLabel, temp.size()+1, (LPWSTR)temp.c_str()); 
    ::MessageBox(NULL,s.c_str(),"getCopy",0); 
    return; 
} 

私は、デバッガを使って行を監視しました。それは正常に機能します(つまり、a-> pszLabelのコンテンツは期待通りですが、sのコンテンツと同じです)。返されたときにエラーが表示されました:

First-chance exception at 0x770f3067 in CPTest.exe: 0xC0000005: Access violation reading location 0x00200074. 
Unhandled exception at 0x770f3067 in CPTest.exe: 0xC0000005: Access violation reading location 0x00200074. 

これを解決する方法を知っている人はいますか?教えてください。あなたの答えは高く評価されている:)

おかげで、 Reinardus

EDIT:そうそう、型CREDENTIAL_PROVIDER_FIELD_DESCRIPTORは構造体であり、そのメンバーの1は、*

+0

万が一あなたの文字列に 't'が入っていませんか? 「読書場所」は「s」の内容に依存するようですか? – Gabe

+0

ええ、実際に私はそこに新しいWCHARを作るのを間違えました。答えを見てください、それは私の問題を解決します:) – user654894

答えて

2

a->pszLabel = new WCHAR(temp.length()+1);は、文字列の長さに1を加えた値の新しいWCHARへのポインタを返します。あなたはa->pszLabel = new WCHAR[temp.length()+1];を意味し、新しい配列WCHARへのポインタを返します。要素の数は、文字列の長さに1を加えたものになります。

+0

OH MAN!もちろん、愚かな私...ありがとう、これはそれを解決する:) – user654894

0

これらの事のwchar_tでpszLabel、ありますより完全な情報なしではデバッグが難しいですが、関数から戻るときにエラーが表示されるのであれば、バッファオーバーフローが戻りアドレスを上書きし、コードが任意の非rxメモリ位置にジャンプすることになります。

関連する問題