我正在尝试使用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);
我出错的任何建议?
P.S如果我使用wchar_t path[]
代替wchar_t* path
,我会在调试模式下收到损坏警告,但是当我点击“继续”时,它会在不中断应用程序的情况下执行。在发布模式下,根本不显示错误。
的问候, 安迪
更新:这是整个代码:我想要实现的是从嵌入在dll中的resoure播放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;
}
答案 0 :(得分:2)
您的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);
。整洁。)
答案 1 :(得分:0)
你正在写一个常量内存字符串的结尾。尝试malloc'ing一个rsize长度的wchat_t *缓冲区并复制路径路径,然后将文件名附加到其中。