Ошибка нарушения доступа при использовании wcscat_s для объединения двух wchar_t * - PullRequest
1 голос
/ 09 сентября 2011

Я пытаюсь объединить один wchar [] в wchar_t * с помощью функции wcscat_s.Я продолжаю получать сообщение об ошибке нарушения прав доступа.

Вот код

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

Есть предложения, где я ошибаюсь?

PS Если я использую wchar_t path[] вместо wchar_t* path, я получаю предупреждение о повреждении в режиме отладки, но оно выполняется без прерывания приложения, когда я нажимаю продолжить.В режиме выпуска ошибка не отображается вообще.

regards, andy

Обновление: вот весь код: то, чего я хочу добиться, - это воспроизвести волновой файл из ресурса, встроенного в DLL ...

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

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Ваш 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.)

0 голосов
/ 09 сентября 2011

Вы пишете через конец строки постоянной памяти. Попробуйте malloc'ing буфер wchat_t * длины rsize и скопировать путь пути, а затем добавьте в него имя файла.

...