2

wcscat_s 関数を使用して、1 つの wchar[] を wchar_t* に連結しようとしています。アクセス違反エラーが発生し続けます。

ここにコードがあります

HANDLE hFindDll = FindFirstFile(dllDir,&findDllData);
wchar_t *path = L"C:\\Users\\andy\\Documents\\SampleProj\\";
rsize_t rsize = wcslen(path)+wcslen(findDllData.cFileName)+5;
wcscat_s(path,rsize,findDllData.cFileName);

私が間違っている提案はありますか?

PSwchar_t path[]の代わりに使用するとwchar_t* path、デバッグモードで破損警告が表示されますが、続行をクリックするとアプリケーションを壊すことなく実行されます。リリース モードでは、エラーはまったく表示されません。

よろしく、アンディ

更新: ここにコード全体があります: 私が達成したいのは、dll に埋め込まれたリソースから wave ファイルを再生することです...

int _tmain(int argc, _TCHAR* argv[])
{
    WIN32_FIND_DATA findDllData;
    HANDLE hFindDll;
    LPCWSTR dllDir = L"C:\\Users\\andy\\Documents\\SampleProj\\*.dll";
    HMODULE hICR;
    HRSRC hRes;

hFindDll = FindFirstFile(dllDir,&findDllData);
        if(hFindDll != INVALID_HANDLE_VALUE)
        {
            do
            {
                const wchar_t * path = L"C:\\Users\\andy\\Documents\\SampleProj\\";
                rsize_t rsize = wcslen(path)+wcslen(findDllData.cFileName)+2;
                wchar_t dst[1024];
                wcscat_s(dst,1024,path); //--> this is where EXCEPTION occurs
                wcscat_s(dst,1024,findDllData.cFileName);


                hICR = LoadLibrary(dst);
                hRes = FindResource(hICR, MAKEINTRESOURCE(200), _T("WAVE"));
                if(hRes != NULL)
                {
                    break;
                }
            }while(FindNextFile(hFindDll,&findDllData));
            HGLOBAL hResLoad = LoadResource(hICR, hRes);
            PlaySound(MAKEINTRESOURCE(200), hICR,SND_RESOURCE | SND_ASYNC); 
        }

return 0;
}
4

2 に答える 2

3

Yourは、定数で不変の読み取り専用配列pathへのポインターです。関数は宛先バッファーに書き込み、最後にデータを追加するため、そこには入れません。cat*cat()

代わりに、変更可能な受信者バッファーを作成します。

const wchar_t * path = L"C:\\Users\\andy\\Documents\\SampleProj\\";

wchar_t dst[LARGE_NUMBER] = { 0 };  // ugh, very 1990

wcscat_s(dst, LARGE_NUMBER, path);
wcscat_s(dst, LARGE_NUMBER, findDllData.cFileName);

(更新:どうやら、静的配列を認識するこの関数のテンプレート化されたオーバーロードもあるようです: wcscat_s(dst, path);. Neat.)

于 2011-09-09T15:43:07.887 に答える
0

定数メモリ文字列の末尾に書き込んでいます。rsize の長さの wchat_t* バッファを malloc し、パス path をコピーしてからファイル名を追加してみてください。

于 2011-09-09T15:44:33.420 に答える