Quote:
int ProcessFiles(const char* pszFiles, FILECALLBACK pFunc, void* pArgs)
{
HRESULT hr = S_OK;
int i;
WCHAR* wszArg = WideString(pszFiles);
WIN32_FIND_DATA FindFileData;
HANDLE handle = ::FindFirstFile(wszArg, &FindFileData);
int failed = 0;
if (handle == INVALID_HANDLE_VALUE)
{
// Then maybe it's a URL.
hr = (*pFunc)(wszArg, pArgs);
if (hr != 0) failed++;
goto CleanUp;
}
for ( i = wcslen(wszArg)-1; i >= 0 && wszArg[i] != '\\'; i--)
{
wszArg[i] = 0;
}
while (handle != INVALID_HANDLE_VALUE)
{
ULONG len1 = wcslen(wszArg);
ULONG len2 = wcslen(FindFileData.cFileName);
WCHAR* buffer = new WCHAR[len1 + len2 + 1];
if (buffer == NULL)
{
hr = E_OUTOFMEMORY;
goto CleanUp;
}
memcpy(buffer, wszArg, sizeof(WCHAR) * len1);
memcpy(&buffer[len1], FindFileData.cFileName, sizeof(WCHAR) * len2);
buffer[len1+len2] = '\0';
hr = (*pFunc)(buffer, pArgs);
if (hr != 0) failed++;
delete[] buffer;
if (! ::FindNextFile(handle, &FindFileData))
break;
}
if (handle != INVALID_HANDLE_VALUE)
::FindClose(handle);
CleanUp:
delete wszArg;
return failed;
}