ShellExecuteEx.html未注册SE_ERR_NOASSOC(从Delphi调试器运行时)

ShellExecuteEx.html未注册SE_ERR_NOASSOC(从Delphi调试器运行时),delphi,winapi,windows-10,windows-shell,delphi-10.3-rio,Delphi,Winapi,Windows 10,Windows Shell,Delphi 10.3 Rio,目前,我在尝试使用ShellExecuteEx打开URL(如)时遇到问题。 我的目标是在未来看到它 注册标准浏览器(如Firefox、IE、Chrome等) 过程RunNoWait(一个程序:string;一个参数:string;一个工作目录:string;AUAC:Boolean;AShow:Integer=SW_SHOWNORMAL); 变量 sei:tshellexecuteinfo; 战神:布尔; 开始 //也不起作用: //aRes:=ShellExecute(Application.

目前,我在尝试使用ShellExecuteEx打开URL(如)时遇到问题。 我的目标是在未来看到它 注册标准浏览器(如Firefox、IE、Chrome等)

过程RunNoWait(一个程序:string;一个参数:string;一个工作目录:string;AUAC:Boolean;AShow:Integer=SW_SHOWNORMAL);
变量
sei:tshellexecuteinfo;
战神:布尔;
开始
//也不起作用:
//aRes:=ShellExecute(Application.Handle,'open',PWideChar(一个程序),0,0,SW_SHOW);

//如果根据
tshellexecuteinfo
,aRes,则使用unicode的字符集,因此
ShellExecute
ShellExecuteEx
都指版本
***W
sei.lpVerb
的类型被认为不正确。 看到这个了吗

只要字符串文字中没有非ANSI字符, 编译器在生成ANSI格式的字符串时不会遇到任何问题 而不是在这种情况下使用Unicode

你应该:

const
  method = 'open';
sei.lpVerb := PWideChar(method);
同样的问题可以在C++中重现:

#include <windows.h>
#include <iostream>
int main()
{
    SHELLEXECUTEINFOW sei = { 0 };
    sei.cbSize = sizeof(sei);
    sei.fMask = SEE_MASK_FLAG_NO_UI| SEE_MASK_FLAG_DDEWAIT| SEE_MASK_NOCLOSEPROCESS;
    sei.nShow = SW_SHOW;
    sei.lpVerb = (LPCWSTR)"open";
    sei.lpFile = L"http://example.com/test/customer.html?sessionid=291697";
    sei.hwnd = NULL;

    BOOL bInitialized = SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));

    if (ShellExecuteExW(&sei))
    {
        //Success
        printf("Success \n");
    }
    else
    {
        //Failed
        printf("Failed %d\n", GetLastError());
    }

    if (bInitialized)
    {
        CoUninitialize();
    }
    return 0;
}
#包括
#包括
int main()
{
ShellExecuteInfo sei={0};
sei.cbSize=sizeof(sei);
sei.fMask=见_MASK_FLAG_NO_UI |见_MASK_FLAG_DDEWAIT |见_MASK_NOCLOSEPROCESS;
sei.nShow=SW_SHOW;
sei.lpVerb=(LPCWSTR)“打开”;
sei.lpFile=L“http://example.com/test/customer.html?sessionid=291697";
sei.hwnd=NULL;
BOOL bininitialized=成功(coinitializex(NULL,COINIT_APARTMENTTHREADED | COINIT_DISABLE_ole1de));
if(ShellExecuteXW(&sei))
{
//成功
printf(“成功”\n);
}
其他的
{
//失败
printf(“失败的%d\n”,GetLastError());
}
如果(b初始化)
{
coninitialize();
}
返回0;
}

修复方法是将
(LPCWSTR)“open”
修改为
L“open”
,,毕竟,我看到了,我看错了方向:

问题只存在于从Delphi调试器启动应用程序时

如果在没有Delphi的情况下启动应用程序,所有浏览器都可以工作

[编辑:] 刚刚找到原因:工具->选项->调试器选项->Embarcadero调试器->在衍生进程中调试”处于活动状态。
看起来那些浏览器不想被调试。。。(无论如何,我们没有他们的来源)

”。将URL复制到Windows资源管理器中…“-这意味着什么?无论如何,答案可能是
http://example.com/test/customer.html?sessionid=291697
无法识别(extension=html?sessionid=291697)。使用该名称创建一个文件,双击,您将得到相同的文件。检查“http”是否与“控制面板”中的“默认程序”中不工作的程序相关联。尝试使用
sei.lpVerb:=nil而不是
sei.lpVerb:=“打开”并非所有应用都使用
'open'
作为默认动词。当您刚刚关闭句柄时,为什么要使用SEE\u MASK\u NOCLOSEPROCESS?您不能依赖于获取协议的进程句柄,因为DDE在浏览器中很常见;sei.lpVerb:=PWideChar(methodOpen);没有区别。。。