C++ 无法使用PhotoViewer.dll执行CreateProcess

C++ 无法使用PhotoViewer.dll执行CreateProcess,c++,winapi,C++,Winapi,在我的应用程序中,有一个界面,用户可以选择任何文件,并根据文件关联在其默认应用程序中打开 我正在使用FindExecutable和CreateProcessAsUser以及Explorer令牌 现在的问题是在图片文件的情况下,例如.jpg,FindExecutable返回“C:\Program files\Windows Photo Gallery\PhotoViewer.dll”,然后CreateProcessAsUser返回“ERROR\u BAD\u EXE\u FORMAT(193)%1

在我的应用程序中,有一个界面,用户可以选择任何文件,并根据文件关联在其默认应用程序中打开

我正在使用FindExecutable和CreateProcessAsUser以及Explorer令牌

现在的问题是在图片文件的情况下,例如.jpg,FindExecutable返回“C:\Program files\Windows Photo Gallery\PhotoViewer.dll”,然后CreateProcessAsUser返回“ERROR\u BAD\u EXE\u FORMAT(193)%1不是有效的Win32应用程序”。我将NULL作为CreateProcessAsUser的第二个参数传递,在lpCommandLine中发送可执行路径(例如:CreateProcessAsUser(hToken,NULL,szCmdline,…)

有人能帮我解决这个问题吗

问候,,
Manoj

如何使用具有正确初始化结构的
ShellExecuteEx
?这将调用给定文件的默认操作。

Win32可执行文件的扩展名为.EXE;DLL不是可执行文件。CreateProcess无法仅使用.DLL创建进程。缺少的.EXE是“rundll32.EXE”


然而,这并不是你想要的:你想要的是Shell行为<代码>ShellExecuteEx()通常是最方便的函数
AssocQueryString()
在这种情况下可能是合适的,带有正确的标志:
ASSOCSTR\u EXECUTABLE
在未运行时获取可执行文件;
ASSOCSTR\u DDEAPPLICATION
等,在应用程序已运行时获取可执行文件

我的应用程序正在作为Web服务运行。因此,ShellExecuteEx不会确保新应用程序始终在前台打开。您可能会成功尝试“RUNDLL”。然而,我想指出的是,从web服务运行桌面应用程序确实是个坏主意。web服务是客户端与之通信的东西。@B争论:我不知道您是否指的是我的回复,但正如我所说的,我认为使用shell代码(如“使用默认应用程序打开文件”)通常是一个非常糟糕的主意来自一个本应安静运行并接受和回答客户请求的web服务。@Thorsten Dittmar:同意,但我的web服务是一个本地服务,就像google desktopsearch一样。google Desktop search和其他服务有一个always running in background.exe来进行这种竞标。如果您的Web服务需要在用户的桌面上打开某些东西,它应该向运行在它上面的某种进程发送一个信号,监听这样一个信号,以执行此操作。