Как открыть изображение из ресурсов в photoviewer на языке C++?
я хочу открыть картинку в формате Jpg, bmp или gif
я добавил его к ресурсу, чтобы он был привязан к exe-файлу и не был взят с жесткого диска клиента, который запускает exe-файл
теперь то, что я хочу сделать, это открыть эту картинку и отобразить ее в photoviewer окна os
мой код c++ сделан на пустом проекте с многобайтовым набором символов.
Ниже приведено то, что я получил из сети, но у него есть несколько проблем, таких как, прежде всего, его в UNICODE
затем он использует жесткое кодирование для путей, таких как его использование
WCHAR wsParameters[MAX_PATH] = L"\"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\" ImageView_Fullscreen ";это не обязательно, что каждая ОС будет находиться в диске C
тогда на этой линии
WCHAR wsFile[MAX_PATH] = L"E:\\Temp\\test.jpg";
он хранит файл на жестком диске клиента, чего я не хочу делать
поэтому любой suggesstions??
Что я уже пробовал:
void SaveIStreamToFile(IStream *pIStream, LPWSTR pwsFile) { HANDLE hFile; LPVOID pv = NULL; LARGE_INTEGER li; DWORD nNbBytesWritten; ULONG nNbBytes; HRESULT hr; int nBufferSize = 4096; hFile = CreateFile(pwsFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { pv = (LPSTR)LocalAlloc(LPTR, nBufferSize); if (pv) { LISet32(li, 0); pIStream->Seek(li, STREAM_SEEK_SET, NULL); do { hr = pIStream->Read(pv, nBufferSize, &nNbBytes); if (SUCCEEDED(hr)) { if (!WriteFile(hFile, pv, nNbBytes, &nNbBytesWritten, NULL)) hr = E_FAIL; } } while ((SUCCEEDED(hr)) && (nNbBytes == nBufferSize)); LocalFree(pv); } CloseHandle(hFile); } return; } int main() { HRESULT(STDAPICALLTYPE * pSHCreateStreamOnDllResourceW)(PCWSTR pwszDll, PCWSTR pwszName, PCWSTR pwszType, IStream** ppstm); HMODULE hInst = LoadLibrary(L"SHLWAPI.DLL"); if (hInst) { (FARPROC&)pSHCreateStreamOnDllResourceW = GetProcAddress(hInst, (LPCSTR)MAKEINTRESOURCE(627)); IStream *pstm; if (pSHCreateStreamOnDllResourceW) { WCHAR wszPath[MAX_PATH]; GetModuleFileNameW(NULL, wszPath, MAX_PATH); HRESULT hr = pSHCreateStreamOnDllResourceW(wszPath, (LPWSTR)MAKEINTRESOURCE(IDR_JPEG1), L"JPEG", &pstm); WCHAR wsFile[MAX_PATH] = L"E:\\Temp\\test.jpg"; SaveIStreamToFile(pstm, wsFile); WCHAR wsParameters[MAX_PATH] = L"\"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\" ImageView_Fullscreen "; lstrcat(wsParameters, wsFile); WCHAR wsProgram[MAX_PATH] = L"rundll32.exe"; SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.fMask = SEE_MASK_NOASYNC | SEE_MASK_NOCLOSEPROCESS; sei.hwnd = NULL; sei.lpVerb = L"open"; sei.lpFile = wsProgram; sei.lpParameters = wsParameters; sei.nShow = SW_SHOWNORMAL; BOOL bReturn = ShellExecuteEx(&sei); } } }
Richard MacCutchan
Вы никогда не должны жестко кодировать пути к файлам в своих приложениях. Если вы хотите получить доступ к файлу, то используйте один из классов FileDialog, который позволяет пользователю выбрать его.