int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HRESULT hResult;

	hResult = CoInitialize(NULL);

	if (SUCCEEDED(hResult))
	{
		IShellDispatch * pISD;

		hResult = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD);

		if (SUCCEEDED(hResult) && NULL != pISD)
		{
			FILE * File = fopen(ParameterFilename, "rb");

			if (NULL == File)
			{
				// Perform the Taskbar operation
				pISD->TileVertically();

				// Create file
				File = fopen(ParameterFilename, "wb");
				if (NULL != File) fclose(File);
			}
			else
			{
				// Undo the last Taskbar operation
				pISD->UndoMinimizeALL();

				// Make sure the file is empty before removing it (as to not accidentally delete a user's valuable file)
				fseek(File, 0, SEEK_END); long FileSize = ftell(File); if (0 != FileSize) MessageBox(NULL, "Warning: The file 'OrganizeWindows_ShouldUndoNextTime' was not empty. When this program creates it, it should be empty.\n\nIt will not be deleted in case you have valuable information there. Please delete it yourself, or move this program into another folder that doesn't have a file with such name.", "OrganizeWindows", MB_ICONWARNING);
				fclose(File);
				if (0 == FileSize) remove(ParameterFilename);
			}

			pISD->Release();
		}

		CoUninitialize();
	}

	return EXIT_SUCCESS;
}
void CDlgApplication::OnApplicationNewTask()
{
	// 打开运行窗口
	CoInitialize(NULL);

	IShellDispatch *shell = NULL;
	HRESULT hr = CoCreateInstance(CLSID_Shell
		, NULL
		, CLSCTX_SERVER
		, IID_IDispatch,
		(void**)&shell);
	if (FAILED(hr) || !shell)
	{
		return;
	}

	shell->FileRun();
	shell->Release();

	CoUninitialize();
}
BOOL GetFileInfo(CLOUD_MEIDA_METADATA_STRUCT* instruct,const CString filepath,bool* bIsAudio,bool* bIsPhoto,bool* bIsVideo)
{
	CString fileDir ,fileName;
	fileDir.Append(filepath);
 	
	PathRemoveFileSpec((LPWSTR)(LPCTSTR)fileDir);//Get dir Name
	fileName.Append(PathFindFileName(filepath));//Get file name
 
	IShellDispatch* pShellDisp = NULL;  
    Folder *pFolder;  
    FolderItem *pFolderItem;  
    CComBSTR    stitle,str;  
    HRESULT hr = S_OK;  
	CoInitialize(NULL);  
  
    hr =  ::CoCreateInstance( CLSID_Shell, NULL,CLSCTX_SERVER, IID_IShellDispatch, (LPVOID*)&pShellDisp );  
  
    if( hr == S_OK )  
    {  
        hr = pShellDisp->NameSpace(CComVariant(fileDir),&pFolder);    
        hr = pFolder->ParseName(CComBSTR(fileName),&pFolderItem);  
        CComVariant vItem(pFolderItem);  

        //CComVariant vEmpty;  
        //int i = 0;  
   
   //     for (int i = 0 ;i < 100;i++)  
   //     {  
   //         hr = pFolder->GetDetailsOf(vEmpty,i,&stitle);  
   //         hr = pFolder->GetDetailsOf(vItem,i,&str);  
			//COLE2T lpszTitle(stitle);  
			//COLE2T lpszInfo(str);  
			//TCHAR buf[300];  
			//afxDump <<i <<":		"<< lpszTitle.m_psz<<"		"<<lpszInfo.m_psz<<"\n";
   //          int a = 1;  
   //     }  
		CString csPerceivedType;
 
		csPerceivedType = GetDetailsOf(pFolder,vItem,COLUMN_SORTING_TYPE_PerceivedType);
		*bIsAudio = PathMatchSpec(csPerceivedType,_T("audio"));
		*bIsPhoto = PathMatchSpec(csPerceivedType,_T("image"));
		*bIsVideo =  PathMatchSpec(csPerceivedType,_T("video"));
		instruct->Duration = GetDurection(GetDetailsOf(pFolder,vItem,COLUMN_SORTING_TYPE_Duration));

		if(!*bIsAudio && !*bIsPhoto && !*bIsVideo)
			return FALSE;

		if(*bIsAudio)
		{
			instruct->Album = GetDetailsOf(pFolder,vItem,COLUMN_SORTING_TYPE_Album);
		}
		else
		{
 
				instruct->Album = fileDir;
				instruct->Date = GetTime(GetDetailsOf(pFolder,vItem,COLUMN_SORTING_TYPE_CreatedDate));	
 
 		}
		instruct->Size = GetDetailsOf(pFolder,vItem,COLUMN_SORTING_TYPE_Size);
		instruct->Title = GetDetailsOf(pFolder,vItem,COLUMN_SORTING_TYPE_Title);
		if(instruct->Title.IsEmpty())
		{
			CString csFileNameWithOutExtension;
			csFileNameWithOutExtension.Append(fileName);
			 PathRemoveExtension((LPWSTR)(LPCTSTR)csFileNameWithOutExtension);
			 instruct->Title = csFileNameWithOutExtension;
		}
		instruct->Genre = GetDetailsOf(pFolder,vItem,COLUMN_SORTING_TYPE_Genre);
        hr = pShellDisp->Release();  
        pShellDisp = NULL;  

    }  
    CoUninitialize();  
	return TRUE;
}
Exemple #4
0
bool CPathUtils::Unzip2Folder(LPCWSTR lpZipFile, LPCWSTR lpFolder)
{
    IShellDispatch *pISD;

    Folder  *pZippedFile = 0L;
    Folder  *pDestination = 0L;

    long FilesCount = 0;
    IDispatch* pItem = 0L;
    FolderItems *pFilesInside = 0L;

    VARIANT Options, OutFolder, InZipFile, Item;
    HRESULT hr = S_OK;
    CoInitialize(nullptr);
    __try
    {
        if (CoCreateInstance(CLSID_Shell, nullptr, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD) != S_OK)
            return false;

        InZipFile.vt = VT_BSTR;
        InZipFile.bstrVal = const_cast<BSTR>(lpZipFile);
        hr = pISD->NameSpace(InZipFile, &pZippedFile);
        if (FAILED(hr) || !pZippedFile)
        {
            pISD->Release();
            return false;
        }

        OutFolder.vt = VT_BSTR;
        OutFolder.bstrVal = const_cast<BSTR>(lpFolder);
        pISD->NameSpace(OutFolder, &pDestination);
        if (!pDestination)
        {
            pZippedFile->Release();
            pISD->Release();
            return false;
        }

        pZippedFile->Items(&pFilesInside);
        if (!pFilesInside)
        {
            pDestination->Release();
            pZippedFile->Release();
            pISD->Release();
            return false;
        }

        pFilesInside->get_Count(&FilesCount);
        if (FilesCount < 1)
        {
            pFilesInside->Release();
            pDestination->Release();
            pZippedFile->Release();
            pISD->Release();
            return true;
        }

        pFilesInside->QueryInterface(IID_IDispatch, (void**)&pItem);

        Item.vt = VT_DISPATCH;
        Item.pdispVal = pItem;

        Options.vt = VT_I4;
        Options.lVal = 1024 | 512 | 16 | 4;//http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx

        bool retval = pDestination->CopyHere(Item, Options) == S_OK;

        pItem->Release(); pItem = 0L;
        pFilesInside->Release(); pFilesInside = 0L;
        pDestination->Release(); pDestination = 0L;
        pZippedFile->Release(); pZippedFile = 0L;
        pISD->Release(); pISD = 0L;

        return retval;

    }
    __finally
    {
        CoUninitialize();
    }
}
Exemple #5
0
static int MyInvokeShellVerb_ShellDispatchProc(const TCHAR *pcDirectoryName, const TCHAR *pcFileName, const DWORD uiVerbId)
{
	int iSuccess = 0;

	bool bUnloadDll = false;
	HMODULE hShellDll = GetModuleHandleW(shell32); 
	if(hShellDll == NULL)
	{
		bUnloadDll = true;
		hShellDll = LoadLibraryW(shell32);
		if(hShellDll == NULL)
		{
			iSuccess = -3;
			return iSuccess;
		}
	}

	WCHAR pcVerbName[128];
	memset(pcVerbName, 0, sizeof(WCHAR) * 128);
	
	if(LoadStringW(hShellDll, uiVerbId, pcVerbName, 128) < 1)
	{
		if(bUnloadDll)
		{
			FreeLibrary(hShellDll);
			hShellDll = NULL;
		}
		iSuccess = -3;
		return iSuccess;
	}

	if(bUnloadDll)
	{
		FreeLibrary(hShellDll);
		hShellDll = NULL;
	}

	// ----------------------------------- //

	IShellDispatch *pShellDispatch = NULL;
	Folder *pFolder = NULL; FolderItem *pItem = NULL;
	
	HRESULT hr = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void**)&pShellDispatch);
	if(FAILED(hr) || (pShellDispatch ==  NULL))
	{
		iSuccess = -3;
		return iSuccess;
	}

	variant_t vaDirectory(pcDirectoryName);
	hr = pShellDispatch->NameSpace(vaDirectory, &pFolder);
	if(FAILED(hr) || (pFolder == NULL))
	{
		iSuccess = -3;
		pShellDispatch->Release();
		return iSuccess;
	}

	pShellDispatch->Release();
	pShellDispatch = NULL;

	variant_t vaFileName(pcFileName);
	hr = pFolder->ParseName(vaFileName, &pItem);
	if(FAILED(hr) || (pItem == NULL))
	{
		iSuccess = -3;
		pFolder->Release();
		return iSuccess;
	}

	pFolder->Release();
	pFolder = NULL;

	// ----------------------------------- //

	long iVerbCount = 0;
	FolderItemVerbs *pVerbs = NULL;
	
	hr = pItem->Verbs(&pVerbs);
	if(FAILED(hr) || (pVerbs == NULL))
	{
		iSuccess = -3;
		pItem->Release();
		return iSuccess;
	}

	pItem->Release();
	pItem = NULL;

	hr = pVerbs->get_Count(&iVerbCount);
	if(FAILED(hr) || (iVerbCount < 1))
	{
		iSuccess = -3;
		pVerbs->Release();
		return iSuccess;
	}

	DispatchPendingMessages(125);

	// ----------------------------------- //

	for(int i = 0; i < iVerbCount; i++)
	{
		variant_t vaVariantIndex(i);
		FolderItemVerb *pCurrentVerb = NULL;
		BSTR pcCurrentVerbName = NULL;

		hr = pVerbs->Item(vaVariantIndex, &pCurrentVerb);
		if (FAILED(hr) || (pCurrentVerb == NULL))
		{
			continue;
		}
		
		hr = pCurrentVerb->get_Name(&pcCurrentVerbName);
		if(FAILED(hr) || (pcCurrentVerbName == NULL))
		{
			pCurrentVerb->Release();
			continue;
		}

		if(_wcsicmp(pcCurrentVerbName, pcVerbName) == 0)
		{
			hr = pCurrentVerb->DoIt();
			if(!FAILED(hr))
			{
				iSuccess = 1;
			}
		}

		SysFreeString(pcCurrentVerbName);
		pCurrentVerb->Release();
	}

	pVerbs->Release();
	pVerbs = NULL;

	// ----------------------------------- //
	
	return iSuccess;
}