2

我正在尝试使用 wcscat_s 函数将一个 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);

有什么建议我哪里出错了吗?

PS如果我使用wchar_t path[]而不是wchar_t* path,我会在调试模式下收到损坏警告,但是当我单击继续时它会在不破坏应用程序的情况下执行。在发布模式下,错误根本不显示。

问候,安迪

更新:这是整个代码:我想要实现的是从嵌入在 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;
}
4

2 回答 2

3

Yourpath是一个指向常量、不可变、只读数组的指针。你不能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);。整洁。)

于 2011-09-09T15:43:07.887 回答
0

您正在写一个常量内存字符串的末尾。尝试 malloc 一个 rsize 长度的 wchat_t* 缓冲区并复制路径路径,然后将文件名附加到其中。

于 2011-09-09T15:44:33.420 回答