Createprocess有没有办法开启程序时不要有附属关系?

yann2 2016-10-13 10:36:46
实际测试发现,程序A使用Createprocess或者ShellEx调用打开一个程序B时

程序B和程序A有一个"裙带"关系,有没有办法程序A运行程序B的时候,让程序B完全独立,就好像用户手动打开的程序B一样

我不知道Createpro这个API能否实现,若实现不了可有其他办法呢?

望各路大神指点,感谢!!
...全文
183 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yann2 2016-10-16
  • 打赏
  • 举报
回复
引用 4 楼 oyljerry 的回复:
CreateProcessAsUser,用explorer的token来创建进程
已经得到了Explorer的Token CreateProcessAsUserW(hPtokenExplorer, Filepath, NULL, 0, 0, 0, EXTENDED_STARTUPINFO_PRESENT, 0, tszPath, (LPSTARTUPINFOW)&starInfo, &processInfo); 还是不行,为什么?
yann2 2016-10-15
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:

// by creating process ***********************************
BOOL GoNotePad(char *path,BOOL bWait=TRUE)
{
	char pathexe[MAX_PATH];
	strcpy(pathexe,"notepad.exe ");	
	strcat(pathexe,path);//pathname="notepad.exe ",
	STARTUPINFO sinfo;
	PROCESS_INFORMATION pinfo;
	memset (&sinfo,0,sizeof(STARTUPINFO));
	sinfo.cb=sizeof(STARTUPINFO);
	sinfo.dwFlags|=STARTF_USESHOWWINDOW;
	sinfo.wShowWindow=SW_SHOWNORMAL;//SW_SHOW;// SW_SHOWDEFAULT;
//BOOL fsuccess=0;
	BOOL fsuccess=CreateProcess(NULL,//lpApplicationName
				  pathexe,			//lpCommanderLine
				  NULL,				//lpProcessAttributes
				  NULL,				//lpThreadAttributes
				  FALSE,			//bInheritHandles
				  NORMAL_PRIORITY_CLASS,//dwCreationFlags
				  NULL,				//lpEnvironment
				  NULL,				//lpCurrentDirectory
				  &sinfo,			//lpStartupInfo
				  &pinfo);			//lpProcessInformation
// wait for NotePad finishes
	if(fsuccess)
	{
		HANDLE hProcess=pinfo.hProcess;
		CloseHandle(pinfo.hThread);// close thread at once
		if (bWait)
		{
			if (WaitForSingleObject(hProcess,INFINITE)!=WAIT_FAILED)
			{
				DWORD dwExitCode;
				GetExitCodeProcess(hProcess,&dwExitCode);
				if (dwExitCode==STILL_ACTIVE) AfxMessageBox(IDS_NOTEPAD_ALIVE);
			}
		}
		CloseHandle(pinfo.hProcess);
	}
	return(fsuccess);
}
请教下,UpdateProcThreadAttribute最低要求vista,XP下有什么类似的API吗?
yann2 2016-10-15
  • 打赏
  • 举报
回复
引用 1 楼 Sandrer 的回复:
有影响吗? CreateProcess 返回进程句柄, 你不管它继续该干什么就干什么就好了 你的 A 程序退出难道 B 程序会跟着退出吗?
你误会了,仔细看我描述内容。 感谢回复,感谢另外2位的回复,解决了该问题
BeanJoy 2016-10-14
  • 打赏
  • 举报
回复
将子进程的父进程修改为explorer.exe:

#include <Tlhelp32.h>
#include <Windows.h>
#pragma comment(lib, "Advapi32.lib")
int main()
{
	PROCESSENTRY32 pe;
	// explorer.exe的进程ID
	DWORD  pid = 0;

	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	pe.dwSize = sizeof(PROCESSENTRY32);
	if( !Process32First(hSnapshot,&pe) )
		return 0;

	do
	{
		pe.dwSize = sizeof(PROCESSENTRY32);
		if( Process32Next(hSnapshot,&pe)==FALSE )
			break;
		if(wcscmp (pe.szExeFile,L"explorer.exe") == 0)
		{
			pid = pe.th32ProcessID;
			break;
		}

	} while(1);

	CloseHandle(hSnapshot);

	/* 已全部权限打开explorer.exe 进程 */
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);

	/* 创建启动信息结构体 */
	STARTUPINFOEXA si;

	/* 初始化结构体 */
	ZeroMemory(&si,sizeof(si));

	/* 设置结构体成员 */
	si.StartupInfo.cb = sizeof(si);

	SIZE_T lpsize = 0;

	/* 用微软规定的特定的函数初始化结构体 */
	InitializeProcThreadAttributeList(NULL,1,0,&lpsize);

	char * temp = new char[lpsize];

	/* 转换指针到正确类型 */
	LPPROC_THREAD_ATTRIBUTE_LIST AttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)temp;

	/* 真正为结构体初始化属性参数 */
	InitializeProcThreadAttributeList(AttributeList,1,0,&lpsize);

	/* 用已构造的属性结构体更新属性表 */
	if (!UpdateProcThreadAttribute(AttributeList,0,PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &handle,sizeof(HANDLE),NULL,NULL))
	{
	}

	/* 移交指针,这里已更换了父进程的属性表是 explorer.exe */
	si.lpAttributeList = AttributeList;

	PROCESS_INFORMATION pi;

	ZeroMemory(&pi, sizeof(pi));

	if (CreateProcessAsUserA(NULL,0,"notepad.exe",0, 0, 0, EXTENDED_STARTUPINFO_PRESENT,0, 0, (LPSTARTUPINFOA)&si, &pi))
	{
	}
	else
	{
	}

	/* 处理后事 */
	DeleteProcThreadAttributeList(AttributeList);

	delete temp;

	printf("exit");
	getch();

	return 0;
}
schlafenhamster 2016-10-14
  • 打赏
  • 举报
回复

// by creating process ***********************************
BOOL GoNotePad(char *path,BOOL bWait=TRUE)
{
	char pathexe[MAX_PATH];
	strcpy(pathexe,"notepad.exe ");	
	strcat(pathexe,path);//pathname="notepad.exe ",
	STARTUPINFO sinfo;
	PROCESS_INFORMATION pinfo;
	memset (&sinfo,0,sizeof(STARTUPINFO));
	sinfo.cb=sizeof(STARTUPINFO);
	sinfo.dwFlags|=STARTF_USESHOWWINDOW;
	sinfo.wShowWindow=SW_SHOWNORMAL;//SW_SHOW;// SW_SHOWDEFAULT;
//BOOL fsuccess=0;
	BOOL fsuccess=CreateProcess(NULL,//lpApplicationName
				  pathexe,			//lpCommanderLine
				  NULL,				//lpProcessAttributes
				  NULL,				//lpThreadAttributes
				  FALSE,			//bInheritHandles
				  NORMAL_PRIORITY_CLASS,//dwCreationFlags
				  NULL,				//lpEnvironment
				  NULL,				//lpCurrentDirectory
				  &sinfo,			//lpStartupInfo
				  &pinfo);			//lpProcessInformation
// wait for NotePad finishes
	if(fsuccess)
	{
		HANDLE hProcess=pinfo.hProcess;
		CloseHandle(pinfo.hThread);// close thread at once
		if (bWait)
		{
			if (WaitForSingleObject(hProcess,INFINITE)!=WAIT_FAILED)
			{
				DWORD dwExitCode;
				GetExitCodeProcess(hProcess,&dwExitCode);
				if (dwExitCode==STILL_ACTIVE) AfxMessageBox(IDS_NOTEPAD_ALIVE);
			}
		}
		CloseHandle(pinfo.hProcess);
	}
	return(fsuccess);
}
Sandrer 2016-10-14
  • 打赏
  • 举报
回复
有影响吗? CreateProcess 返回进程句柄, 你不管它继续该干什么就干什么就好了 你的 A 程序退出难道 B 程序会跟着退出吗?
oyljerry 2016-10-14
  • 打赏
  • 举报
回复
CreateProcessAsUser,用explorer的token来创建进程

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧