如何通过Windows API打开网络适配器属性?

问题描述 投票:0回答:1

我正在创建一个自定义 WLAN 连接向导,其灵感来自 Windows XP/Server 2003。在其侧边栏上,有一个“更改高级设置”选项(屏幕截图来自系统 WLAN 向导,不是我的),打开适配器属性。在 Windows Vista 和更新版本中,当在网络适配器上单击 RMB 时出现的菜单中单击“属性”时,会执行 ncpa.cpl 相同的操作。这是目标行为。

我尝试在 Microsoft Learn 上挖掘与 Network Configuration Interfaces COM 接口相关的文档,最接近的匹配是 INetCfgComponent::RaisePropertyUi 但它会打开特定的网络 component 设置,这是一个失误 - 它是一个级别 比要求更深。这正是来自 unanwsered 问题 15901907 的代码的作用。

然后我选择搜索未记录的 Windows 界面,并偶然发现了 GUID

{C08956A4-1CD3-11D1-B1C5-00805FC1270E}
,称为
INetConnectionPropertyUi
,HKCR hive 的注册表中缺少该 GUID,但可以通过
CoCreateInstance
访问。我认为使用以下代码会成功(可以在here查看完整文件):

hr = pNetCCPui->AddPages(NULL, PropSheetExCallback, reinterpret_cast<LPARAM>(&pinfo));
if (SUCCEEDED(hr))
{
    if (PropertySheetW(&pinfo) < 0)
        hr = E_FAIL;
}

但是我立即在

0xC0000005
调用时因
PropertySheetW
(访问冲突)而崩溃。崩溃期间会出现所需的属性表,但完全空白。

今天我想到了通过

ShellExecute
获取所需的窗口,认为可以通过特定的 CLSID 访问它。我离目标行为并不远——我至少到达了适配器状态窗口,但再次错过了——这次比要求的一级:

shell:::{7007ACC7-3202-11D1-AAD2-00805FC1270E}\{network adapter GUID}

我通过未回答的(?)问题78393276找到了这种方法,并在超级用户上新移动了问题1840801


我寻找打开适配器属性对话框的方法,但不是:

  • 用户操作模拟,因为这些可能是可见的且具有破坏性(例如 AHK 或
    SendMessageW
  • 在自己的 dll 中重写近一半的 netshell.dll 以包含适配器属性对话框

什么样的解决方案有效:

  • 与COM交互,也许我错过了一个真正可以工作的接口?
  • ShellExecute
    将继续上面的 GUID 链到所需的对话框
  • 过程中不涉及
    ncpa.cpl
    的任何事情
c++ windows winapi com reverse-engineering
1个回答
0
投票

看来我会再再回答我的问题。可以通过

ShellExecuteW
方式到达那里:

{
  ATL::CStringW cswNetworkAdapterPath = L"";
  LPOLESTR lpwszNetConCLSID;

  StringFromIID(CLSID_NetworkConnections, &lpwszNetConCLSID);
  cswNetworkAdapterPath.Format(L"::%s\\::%s", lpwszNetConCLSID, lpwszAdapterGUID);

  ShellExecuteW(NULL, L"properties", cswNetworkAdapterPath, NULL, NULL, SW_SHOWNORMAL);
}

这是一种快速而肮脏的方法,但它确实有效(越不那么肮脏,就越是

CSIDL_CONNECTIONS
方式)。您可能还需要抓住一根线以打开属性表。

© www.soinside.com 2019 - 2024. All rights reserved.