mirror of
https://github.com/indetectables-net/toolkit.git
synced 2025-05-08 19:46:39 +00:00
Update sendto
This commit is contained in:
parent
d0d182dddc
commit
a39eafc5c6
@ -1,16 +0,0 @@
|
||||
@echo off
|
||||
setlocal ENABLEDELAYEDEXPANSION
|
||||
pushd %~dp0
|
||||
|
||||
set appname=sendto+
|
||||
set arch=
|
||||
for /f "usebackq delims=" %%i in (`"cl.exe 2>&1"`) do (
|
||||
if "!arch!"=="" (
|
||||
set arch=%%i
|
||||
set arch=!arch:~-2!
|
||||
)
|
||||
)
|
||||
|
||||
cl.exe /MD /Os /DUNICODE /D_UNICODE /Fe%appname%_x%arch%.exe %appname%.c Ole32.lib shell32.lib user32.lib Comdlg32.lib Shlwapi.lib gdi32.lib gdiplus.lib bufferoverflowU.lib
|
||||
|
||||
popd
|
@ -1,475 +0,0 @@
|
||||
/* cl.exe /MD /Os /DUNICODE /D_UNICODE sendto+.c Ole32.lib shell32.lib user32.lib Comdlg32.lib Shlwapi.lib
|
||||
tcc sendto+.c -DUNICODE -D_UNICODE -DMINGW_HAS_SECURE_API -DINITGUID -lshell32 -lole32 -lshlwapi -lComdlg32 -lgdi32 -lgdiplus
|
||||
|
||||
https://msdn.microsoft.com/en-us/library/cc144093.aspx
|
||||
https://msdn.microsoft.com/en-us/library/windows/desktop/bb776914.aspx
|
||||
https://msdn.microsoft.com/en-us/library/windows/desktop/bb776885.aspx
|
||||
GetCurrentDirectory()
|
||||
|
||||
64-bit
|
||||
Wow64EnableWow64FsRedirection() only for system32;
|
||||
lnk file with parameters need 64-bit version!
|
||||
*/
|
||||
|
||||
#define STRICT
|
||||
|
||||
#ifndef UNICODE
|
||||
#define T_MAX_PATH MAX_PATH
|
||||
#else
|
||||
#define T_MAX_PATH 32767
|
||||
#endif
|
||||
|
||||
#include <tchar.h>
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <windowsx.h>
|
||||
#include <shlobj.h>
|
||||
#include <shlwapi.h>
|
||||
#include <commdlg.h>
|
||||
|
||||
// tcc, any other compiler support wWinMain() and '__argc/__targv'
|
||||
// shlguid.h
|
||||
DEFINE_GUID(IID_IDropTarget, 0x00000122, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
|
||||
DEFINE_GUID(IID_IDataObject, 0x0000010e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
|
||||
|
||||
#define WINGDIPAPI __stdcall
|
||||
#define GDIPCONST const
|
||||
|
||||
typedef enum GpStatus {
|
||||
Ok = 0,
|
||||
GenericError = 1,
|
||||
InvalidParameter = 2,
|
||||
OutOfMemory = 3,
|
||||
ObjectBusy = 4,
|
||||
InsufficientBuffer = 5,
|
||||
NotImplemented = 6,
|
||||
Win32Error = 7,
|
||||
WrongState = 8,
|
||||
Aborted = 9,
|
||||
FileNotFound = 10,
|
||||
ValueOverflow = 11,
|
||||
AccessDenied = 12,
|
||||
UnknownImageFormat = 13,
|
||||
FontFamilyNotFound = 14,
|
||||
FontStyleNotFound = 15,
|
||||
NotTrueTypeFont = 16,
|
||||
UnsupportedGdiplusVersion = 17,
|
||||
GdiplusNotInitialized = 18,
|
||||
PropertyNotFound = 19,
|
||||
PropertyNotSupported = 20,
|
||||
ProfileNotFound = 21
|
||||
} GpStatus;
|
||||
|
||||
typedef DWORD ARGB;
|
||||
typedef void GpBitmap;
|
||||
typedef void *DebugEventProc;
|
||||
typedef GpStatus (WINGDIPAPI *NotificationHookProc)(ULONG_PTR *token);
|
||||
typedef VOID (WINGDIPAPI *NotificationUnhookProc)(ULONG_PTR token);
|
||||
|
||||
typedef struct GdiplusStartupInput {
|
||||
UINT32 GdiplusVersion;
|
||||
DebugEventProc DebugEventCallback;
|
||||
BOOL SuppressBackgroundThread;
|
||||
BOOL SuppressExternalCodecs;
|
||||
} GdiplusStartupInput;
|
||||
|
||||
typedef struct GdiplusStartupOutput {
|
||||
NotificationHookProc NotificationHook;
|
||||
NotificationUnhookProc NotificationUnhook;
|
||||
} GdiplusStartupOutput;
|
||||
|
||||
GpStatus WINGDIPAPI GdiplusStartup(ULONG_PTR *, GDIPCONST GdiplusStartupInput *, GdiplusStartupOutput *);
|
||||
VOID WINGDIPAPI GdiplusShutdown(ULONG_PTR);
|
||||
GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap **bitmap);
|
||||
GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap *bitmap, HBITMAP *hbmReturn, ARGB background);
|
||||
VOID WINGDIPAPI GdipFree(VOID *);
|
||||
|
||||
#define IDM_SENDTOFIRST 0
|
||||
|
||||
TCHAR *g_FOLDER_SENDTO;
|
||||
TCHAR **g_PSENDTO; /* Store the shourtcuts full path */
|
||||
UINT g_idm = IDM_SENDTOFIRST;
|
||||
|
||||
HBITMAP *g_hBmpImageA; /* MenuItemBitmap */
|
||||
|
||||
HINSTANCE g_hinst; /* My hinstance */
|
||||
HMENU g_hmenuSendTo; /* My SendTo popup */
|
||||
LPSHELLFOLDER g_psfDesktop; /* The desktop folder */
|
||||
|
||||
UINT g_FORKING = 0; /* compatible with UAC focus changes */
|
||||
|
||||
LPSHELLFOLDER PIDL2PSF(LPITEMIDLIST pidl)
|
||||
{
|
||||
LPSHELLFOLDER psf = NULL;
|
||||
|
||||
if (pidl) {
|
||||
g_psfDesktop->lpVtbl->BindToObject(g_psfDesktop, pidl, NULL, &IID_IShellFolder, (LPVOID *)&psf);
|
||||
}
|
||||
return psf;
|
||||
}
|
||||
|
||||
LPITEMIDLIST PidlFromPath(HWND hwnd, LPCTSTR pszPath)
|
||||
{
|
||||
LPITEMIDLIST pidl;
|
||||
ULONG ulEaten;
|
||||
DWORD dwAttributes;
|
||||
HRESULT hres;
|
||||
WCHAR *wszName;
|
||||
|
||||
wszName = calloc(T_MAX_PATH + 1, sizeof(WCHAR));
|
||||
#ifdef UNICODE
|
||||
if (wcslen(pszPath) >= T_MAX_PATH) {return NULL;}
|
||||
wcscpy(wszName, pszPath);
|
||||
#else
|
||||
if (!MultiByteToWideChar(CP_ACP, 0, pszPath, -1, wszName, T_MAX_PATH)) {
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
hres = g_psfDesktop->lpVtbl->ParseDisplayName(g_psfDesktop, hwnd, NULL, wszName, &ulEaten, &pidl, &dwAttributes);
|
||||
free(wszName);
|
||||
if (FAILED(hres)) {
|
||||
return NULL;
|
||||
}
|
||||
return pidl;
|
||||
}
|
||||
|
||||
LPSHELLFOLDER GetFolder(HWND hwnd, LPCTSTR pszPath)
|
||||
{
|
||||
LPITEMIDLIST pidl;
|
||||
|
||||
pidl = PidlFromPath(hwnd, pszPath);
|
||||
return PIDL2PSF(pidl);
|
||||
}
|
||||
|
||||
HRESULT GetUIObjectOfAbsPidls(HWND hwnd, LPITEMIDLIST *pidls, INT NumOfpidls, REFIID riid, LPVOID *ppvOut)
|
||||
{
|
||||
LPITEMIDLIST *pidlLasts;
|
||||
LPSHELLFOLDER psf;
|
||||
HRESULT hres;
|
||||
INT i;
|
||||
|
||||
*ppvOut = NULL;
|
||||
pidlLasts = malloc(sizeof(LPITEMIDLIST) * NumOfpidls);
|
||||
if (pidlLasts == NULL) return E_FAIL;
|
||||
|
||||
for (i = 0; i < NumOfpidls; i++) {
|
||||
hres = SHBindToParent(pidls[i], &IID_IShellFolder, (LPVOID *)&psf, (LPCITEMIDLIST *)&pidlLasts[i]);
|
||||
if (FAILED(hres)) goto Fail;
|
||||
if (i < NumOfpidls - 1) psf->lpVtbl->Release(psf);
|
||||
}
|
||||
hres = psf->lpVtbl->GetUIObjectOf(psf, hwnd, NumOfpidls, pidlLasts, riid, NULL, ppvOut);
|
||||
Fail:
|
||||
psf->lpVtbl->Release(psf);
|
||||
return hres;
|
||||
}
|
||||
|
||||
HRESULT GetUIObjectOfPaths(HWND hwnd, LPCTSTR *pszPaths, INT NumOfPaths, REFIID riid, LPVOID *ppvOut)
|
||||
{
|
||||
LPITEMIDLIST *pidls;
|
||||
HRESULT hres;
|
||||
INT i;
|
||||
|
||||
*ppvOut = NULL;
|
||||
pidls = malloc(sizeof(LPITEMIDLIST) * NumOfPaths);
|
||||
if (pidls == NULL) return E_FAIL;
|
||||
|
||||
for (i = 0; i < NumOfPaths; i++) {
|
||||
pidls[i] = PidlFromPath(hwnd, pszPaths[i]);
|
||||
if (pidls[i] == NULL) goto Fail;
|
||||
}
|
||||
hres = GetUIObjectOfAbsPidls(hwnd, pidls, NumOfPaths, riid, ppvOut);
|
||||
Fail:
|
||||
for (i = 0; i < NumOfPaths; i++) {
|
||||
CoTaskMemFree(pidls[i]);
|
||||
}
|
||||
free(pidls);
|
||||
return hres;
|
||||
}
|
||||
|
||||
void DoDrop(LPDATAOBJECT pdto, LPDROPTARGET pdt)
|
||||
{
|
||||
POINTL pt = { 0, 0 };
|
||||
DWORD dwEffect;
|
||||
HRESULT hres;
|
||||
|
||||
dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK;
|
||||
hres = pdt->lpVtbl->DragEnter(pdt, pdto, MK_LBUTTON, pt, &dwEffect);
|
||||
if (SUCCEEDED(hres) && dwEffect) {
|
||||
hres = pdt->lpVtbl->Drop(pdt, pdto, MK_LBUTTON, pt, &dwEffect);
|
||||
}
|
||||
else {
|
||||
hres = pdt->lpVtbl->DragLeave(pdt);
|
||||
}
|
||||
}
|
||||
|
||||
LPTSTR pidl_to_name(LPSHELLFOLDER psf, LPITEMIDLIST pidl, SHGDNF uFlags) {
|
||||
HRESULT hres;
|
||||
STRRET str;
|
||||
LPTSTR pszName = NULL;
|
||||
|
||||
hres = psf->lpVtbl->GetDisplayNameOf(psf, pidl, uFlags, &str);
|
||||
if (hres == S_OK) {
|
||||
hres = StrRetToStr(&str, pidl, &pszName);
|
||||
}
|
||||
return pszName;
|
||||
}
|
||||
|
||||
BOOL GethBitMapByPath(LPTSTR pszPath, HBITMAP *phbmp) {
|
||||
SHFILEINFO ShFI = {0};
|
||||
BOOL hasBmpImage = FALSE;
|
||||
|
||||
if (SUCCEEDED(SHGetFileInfo(pszPath, FILE_ATTRIBUTE_NORMAL, &ShFI, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES))) {
|
||||
GpBitmap *bitmap = NULL;
|
||||
if (GdipCreateBitmapFromHICON(ShFI.hIcon, &bitmap) == Ok) {
|
||||
hasBmpImage = !(GdipCreateHBITMAPFromBitmap(bitmap, phbmp, 0));
|
||||
GdipFree(bitmap);
|
||||
}
|
||||
DestroyIcon(ShFI.hIcon);
|
||||
}
|
||||
return hasBmpImage;
|
||||
}
|
||||
|
||||
void FolderToMenu(HWND hwnd, HMENU hmenu, LPCTSTR pszFolder)
|
||||
{
|
||||
LPSHELLFOLDER psf;
|
||||
HRESULT hres;
|
||||
STRRET str;
|
||||
|
||||
/* OS_WOW6432 */
|
||||
if ((PROC)(GetProcAddress(GetModuleHandle(_T("Shlwapi")), (LPCSTR)437))(30)) {
|
||||
AppendMenu(hmenu, MF_GRAYED | MF_DISABLED | MF_STRING, g_idm, TEXT("64-bit OS needs 64-bit version :p"));
|
||||
return;
|
||||
}
|
||||
|
||||
psf = GetFolder(hwnd, pszFolder);
|
||||
if (psf) {
|
||||
LPENUMIDLIST peidl;
|
||||
hres = psf->lpVtbl->EnumObjects(psf, hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &peidl);
|
||||
if (SUCCEEDED(hres)) {
|
||||
LPITEMIDLIST pidl;
|
||||
MENUITEMINFO mii;
|
||||
MENUINFO mi;
|
||||
BOOL hasBmpImage;
|
||||
while (peidl->lpVtbl->Next(peidl, 1, &pidl, NULL) == S_OK) {
|
||||
LPTSTR pszPath, pszName;
|
||||
//
|
||||
pszPath = pidl_to_name(psf, pidl, SHGDN_FORPARSING);
|
||||
pszName = pidl_to_name(psf, pidl, SHGDN_NORMAL);
|
||||
//
|
||||
// Path should be enough.
|
||||
CoTaskMemFree(pidl);
|
||||
if (pszPath == NULL || pszName == NULL) {continue;}
|
||||
//
|
||||
// Store the path to retrieve, as we check if it is a dir and launch it later.
|
||||
g_PSENDTO = (TCHAR **)realloc(g_PSENDTO, sizeof(TCHAR *) * (g_idm - IDM_SENDTOFIRST + 1));
|
||||
if (g_PSENDTO == NULL) {continue;}
|
||||
g_PSENDTO[g_idm] = _tcsdup(pszPath);
|
||||
//
|
||||
// Icon
|
||||
g_hBmpImageA = (HBITMAP *)realloc(g_hBmpImageA, sizeof(HBITMAP *) * (g_idm - IDM_SENDTOFIRST + 1));
|
||||
hasBmpImage = GethBitMapByPath(pszPath, &g_hBmpImageA[g_idm]);
|
||||
//
|
||||
if (PathIsDirectory(pszPath)) {
|
||||
HMENU hSubMenu = CreatePopupMenu();
|
||||
if (AppendMenu(hmenu, MF_ENABLED | MF_POPUP | MF_STRING, (UINT)hSubMenu, pszName)) {
|
||||
mi.cbSize = sizeof(mi);
|
||||
mi.fMask = MIM_HELPID;
|
||||
mi.dwContextHelpID = g_idm;
|
||||
SetMenuInfo(hSubMenu, &mi);
|
||||
g_idm++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (AppendMenu(hmenu, MF_ENABLED | MF_STRING, g_idm, pszName)) {
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_DATA;
|
||||
if (hasBmpImage) {
|
||||
mii.fMask |= MIIM_BITMAP;
|
||||
mii.hbmpItem = g_hBmpImageA[g_idm];
|
||||
}
|
||||
SetMenuItemInfo(hmenu, g_idm, FALSE, &mii);
|
||||
g_idm++;
|
||||
}
|
||||
}
|
||||
//
|
||||
CoTaskMemFree(pszPath);
|
||||
CoTaskMemFree(pszName);
|
||||
}
|
||||
peidl->lpVtbl->Release(peidl);
|
||||
}
|
||||
psf->lpVtbl->Release(psf);
|
||||
}
|
||||
|
||||
if (g_idm == IDM_SENDTOFIRST) {
|
||||
AppendMenu(hmenu, MF_GRAYED | MF_DISABLED | MF_STRING, g_idm, TEXT("Send what sent to me to my sendto ^_^"));
|
||||
}
|
||||
}
|
||||
|
||||
void SendTo_OnInitMenuPopup(HWND hwnd, HMENU hmenu, UINT item, BOOL fSystemMenu)
|
||||
{
|
||||
if (GetMenuItemCount(hmenu) > 0) {return;}
|
||||
if (hmenu == g_hmenuSendTo) { /* :p only top level */
|
||||
FolderToMenu(hwnd, hmenu, g_FOLDER_SENDTO);
|
||||
}
|
||||
else {
|
||||
MENUINFO mi;
|
||||
mi.cbSize = sizeof(mi);
|
||||
mi.fMask = MIM_HELPID;
|
||||
if (GetMenuInfo(hmenu, &mi)) {
|
||||
FolderToMenu(hwnd, hmenu, g_PSENDTO[mi.dwContextHelpID]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SendTo_SendToItem(HWND hwnd, int idm)
|
||||
{
|
||||
HRESULT hres;
|
||||
|
||||
g_FORKING = 1;
|
||||
if (__argc == 1) {
|
||||
ShellExecute(NULL, NULL, g_PSENDTO[idm], NULL, NULL, SW_SHOWDEFAULT);
|
||||
}
|
||||
else {
|
||||
LPDATAOBJECT pdto;
|
||||
LPDROPTARGET pdt;
|
||||
hres = GetUIObjectOfPaths(hwnd, &g_PSENDTO[idm], 1, &IID_IDropTarget, (LPVOID *)&pdt);
|
||||
if (SUCCEEDED(hres)) {
|
||||
/* First convert all filenames to a data object. */
|
||||
hres = GetUIObjectOfPaths(hwnd, __targv + 1, __argc - 1, &IID_IDataObject, (LPVOID *)&pdto);
|
||||
if (SUCCEEDED(hres)) {
|
||||
/* Now drop the file on the drop target. */
|
||||
DoDrop(pdto, pdt);
|
||||
pdt->lpVtbl->Release(pdt);
|
||||
}
|
||||
}
|
||||
pdto->lpVtbl->Release(pdto);
|
||||
}
|
||||
// Exit as done!
|
||||
g_FORKING = 0;
|
||||
PostQuitMessage(0);
|
||||
}
|
||||
|
||||
void SendTo_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
|
||||
{
|
||||
SendTo_SendToItem(hwnd, id);
|
||||
}
|
||||
|
||||
BOOL SendTo_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
|
||||
{
|
||||
g_hmenuSendTo = CreatePopupMenu();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* UAC focus changes!!! */
|
||||
void SendTo_OnKillFocus(HWND hwnd, HWND hwndOldFocus)
|
||||
{
|
||||
if (g_FORKING == 0) PostQuitMessage(0);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK SendTo_WndProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (uiMsg) {
|
||||
HANDLE_MSG(hwnd, WM_CREATE, SendTo_OnCreate);
|
||||
HANDLE_MSG(hwnd, WM_INITMENUPOPUP, SendTo_OnInitMenuPopup);
|
||||
HANDLE_MSG(hwnd, WM_COMMAND, SendTo_OnCommand);
|
||||
HANDLE_MSG(hwnd, WM_KILLFOCUS, SendTo_OnKillFocus);
|
||||
}
|
||||
|
||||
return DefWindowProc(hwnd, uiMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
BOOL InitApp(void)
|
||||
{
|
||||
WNDCLASS wc;
|
||||
HRESULT hr;
|
||||
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = SendTo_WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = g_hinst;
|
||||
wc.hIcon = NULL;
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = TEXT("SendTo+");
|
||||
|
||||
RegisterClass(&wc);
|
||||
|
||||
hr = SHGetDesktopFolder(&g_psfDesktop);
|
||||
if (FAILED(hr)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_FOLDER_SENDTO = calloc(T_MAX_PATH + 1, sizeof(TCHAR));
|
||||
if (g_FOLDER_SENDTO == NULL) {return FALSE;}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void TermApp(void)
|
||||
{
|
||||
int i, n;
|
||||
|
||||
if (g_psfDesktop) {
|
||||
g_psfDesktop->lpVtbl->Release(g_psfDesktop);
|
||||
g_psfDesktop = NULL;
|
||||
}
|
||||
n = g_idm - IDM_SENDTOFIRST;
|
||||
for (i = 0; i < n; i++) {
|
||||
free(g_PSENDTO[i]);
|
||||
DeleteObject(&g_hBmpImageA[i]);
|
||||
}
|
||||
free(g_PSENDTO);
|
||||
free(g_FOLDER_SENDTO);
|
||||
free((void **)g_hBmpImageA);
|
||||
}
|
||||
|
||||
int WINAPI _tWinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPTSTR lpCmdLine, int nCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
HWND hwnd;
|
||||
HRESULT hrInit;
|
||||
POINT pt = {0, 0};
|
||||
ULONG_PTR gdiplusToken;
|
||||
GdiplusStartupInput gdiplusStartupInput = {1, NULL, FALSE, TRUE}; // MUST!
|
||||
|
||||
g_hinst = hinst;
|
||||
|
||||
if (!InitApp()) return 1;
|
||||
if (GetFullPathName(TEXT("sendto"), T_MAX_PATH, g_FOLDER_SENDTO, NULL) == 0) {return 2;}
|
||||
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
|
||||
hrInit = CoInitialize(NULL);
|
||||
|
||||
hwnd = CreateWindow(
|
||||
TEXT("SendTo+"), /* Class Name */
|
||||
TEXT("lifenjoiner"), /* Title */
|
||||
WS_POPUP, /* Style */
|
||||
CW_USEDEFAULT, CW_USEDEFAULT, /* Position */
|
||||
0, 0, /* Size */
|
||||
NULL, /* Parent */
|
||||
NULL, /* No menu */
|
||||
hinst, /* Instance */
|
||||
0); /* No special parameters */
|
||||
|
||||
SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
|
||||
ShowWindow(hwnd, nCmdShow);
|
||||
|
||||
GetCursorPos(&pt);
|
||||
TrackPopupMenu(g_hmenuSendTo, TPM_LEFTALIGN, pt.x, pt.y, 0, hwnd, NULL);
|
||||
|
||||
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
TermApp();
|
||||
GdiplusShutdown(gdiplusToken);
|
||||
|
||||
if (SUCCEEDED(hrInit)) {
|
||||
CoUninitialize();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user