使用c++打开文件(其他程序文件) 转+修改



#include "stdafx.h"
#include "windows.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "memory.h"
#include <assert.h> 
class CFileManager
{
public :
bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd);
};
bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd)
{
wchar_t lpSubKey[500];
HKEY hKey;
wchar_t strTemp[MAX_PATH];
LONG nSize = sizeof(strTemp);
wchar_t *lpstrCat = NULL; //此指针用来给strTemp赋值
memset(strTemp, 0, sizeof(strTemp));
const wchar_t *lpExt = wcsrchr(lpFile, '.'); //能是从一个字符串中寻找某个字符最后出现的位置
if (!lpExt)
return false;


//查找注册表,查看文件启动方式,如果是直接启动则直接打开,否则的话以调用注册表里的命令打开
//处理注册表开始
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpExt, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
return false;
RegQueryValue(hKey, NULL, strTemp, &nSize);//strTemp = exefile
RegCloseKey(hKey);
memset(lpSubKey, 0, sizeof(lpSubKey));
wsprintf(lpSubKey, _T("%s\\shell\\open\\command"), strTemp);
//lpSubKey = exefile\shell\open\command
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpSubKey, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
return false;
memset(strTemp, 0, sizeof(strTemp));
nSize = sizeof(strTemp);
RegQueryValue(hKey, NULL, strTemp, &nSize);
RegCloseKey(hKey);
//查找 "%1 这个字符串
lpstrCat = wcsstr(strTemp, _T("\"%1"));
//如果没查到 试试 %1
if (lpstrCat == NULL)
lpstrCat = wcsstr(strTemp, _T("%1"));
//如果还是没查到,证明他是用别的东西打开,将要打开的程序以参数方式加到后边  如:记事本 是用notepad.exe 1.txt 形式打开
if (lpstrCat == NULL)
{
lstrcat(strTemp, L" ");
lstrcat(strTemp, lpFile);
}
else//查到了就是直接用CreateProcess 打开文件路径
lstrcpy(lpstrCat, lpFile);
/ 处理注册表结束




STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi;
si.cb = sizeof si;
if (nShowCmd != SW_HIDE)
//如果不隐藏启动,则在第一个桌面用默认方式启动
si.lpDesktop = L"WinSta0\\Default";
else//否则隐藏启动
{
//在另外一个桌面运行达到隐藏窗口的目的
//创建桌面
HDESK hDesk = CreateDesktop(_T("weina"), NULL, NULL, 0, GENERIC_ALL, NULL);
assert(hDesk);
//设置在哪个桌面上运行
si.lpDesktop = L"weina";
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
}
if (CreateProcess(NULL, strTemp, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
return true;
else
return false;
}




int _tmain(int argc, _TCHAR* argv[])
{
//WinExec("C://Users//admin//Desktop//users.html", SW_SHOWMAXIMIZED);
//ShellExecute(, L"open", L"C://Users//admin//Desktop//users.html", NULL, NULL, SW_SHOWNORMAL);
CFileManager filemanager;
filemanager.OpenFile(L"C://Users//admin//Desktop//test.ppt", 1);
getchar();
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值