我创建了一个自定义URL协议处理程序.
http://
mailto://
custom://
我已经注册了一个WinForms应用程序来做出相应的响应.一切都很好.
但我希望能够优雅地处理用户尚未安装自定义URL协议处理程序的情况.
为了能够做到这一点,我需要能够检测浏览器的注册协议处理程序,我想从JavaScript.但我一直无法找到一种方法来查询信息.我希望找到解决这个问题的方法.
感谢您提供的任何想法.
我创建了一个COM +域分区,然后将其映射到Windows 2008服务器计算机并将COM +应用程序导入其中.
我尝试使用以下C#代码远程激活服务器上该特定分区的对象:
//partition guid
Guid guidMyPartition = new Guid("41E90F3E-56C1-4633-81C3-6E8BAC8BDD70");
//parition moniker
string uri= "partition:{" + guidMyPartition + "}/new:MyObject";
Type t = Type.GetTypeFromProgID("MyObject", "MyServer");
MyObject obj = (MyObject)Activator.GetObject(t, uri);
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个例外:
无法创建通道接收器以连接到URL'分区:{41e90f3e-56c1-4633-81c3-6e8bac8bdd70}/new:MyObject'.可能尚未注册适当的频道.
有谁知道如何实现这样的激活?
我发现了一篇关于如何通过调用来提升用C++编写的COM对象
的文章CoCreateInstanceAsAdmin.但是我无法找到或做的是将.NET(c#)应用程序的一个组件实现为COM对象,然后调用该对象来执行需要UAC提升的任务.MSDN将此文档记录为管理COM对象模型.
我知道以管理员身份启动应用程序(或其他应用程序)是可行且非常容易的,以便在单独的过程中执行任务(例如参见Daniel Moth的帖子,但我正在寻找的是一种方式从同一个未提升的.NET可执行文件中做所有事情.当然,这样做会在新进程中生成COM对象,但是由于透明的编组,.NET COM对象的调用者不应该(也是很多)意识到这一点.
关于如何使用C#,C#项目,通过CoCreateInstanceAsAdminAPI 实现C#编写的COM对象的任何想法都会非常有用.所以我真的很想学习如何在C#中编写COM对象,然后我可以通过COM高程API从C#调用它.
不要紧,升高的COM对象是否在同一进程中运行.我只是不想要提升整个应用程序; 我想要提升将执行代码的COM对象.如果我能写出一些东西:
// in a dedicated assembly, marked with the following attributes:
[assembly: ComVisible (true)]
[assembly: Guid ("....")]
public class ElevatedClass
{
public void X() { /* do something */ }
}
Run Code Online (Sandbox Code Playgroud)
然后让我的主应用程序ElevatedClass通过CoCreateInstanceAsAdmin调用实现.但也许我只是在做梦.
如何在Windows系统上创建自己的自定义名字对象(或URL协议)?
例子:
我正在用C 开发一个COM代理对象,我的应用程序将使用它来为需要管理权限的某些操作调用UAC提升对话框.
计划是使它导出一个函数,该函数接受一个带有可变数量参数的函数的指针,并在不同的上下文中执行它.这样,应用程序可以使用此对象以管理员权限执行某些操作,他们需要做的就是使用该对象并将指针传递给必须使用所述权限执行的函数.
这部分工作,调用CoCreateInstance很好,函数指针传递,我的函数执行.但是,当我使用CoCreateInstanceAsAdmin创建此对象的实例时 ,会出现问题; 这是代码:
HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv)
{
// Manual implementation of CreateInstanceAsAdmin
CComPtr BindCtx;
HRESULT hr = CreateBindCtx(0,&BindCtx);
BIND_OPTS3 bo;
memset(&bo, 0, sizeof(bo));
bo.cbStruct = sizeof(bo);
bo.grfMode = STGM_READWRITE;
bo.hwnd = hwnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
hr = BindCtx->SetBindOptions(&bo);
if (SUCCEEDED(hr))
{
// Use the passed in CLSID to help create the COM elevation moniker string
CComPtr Moniker;
WCHAR wszCLSID[50];
WCHAR wszMonikerName[300];
StringFromGUID2(rclsid,wszCLSID,sizeof(wszCLSID) …Run Code Online (Sandbox Code Playgroud) 我想访问远程服务器上的分区COM +应用程序.我试过这个:
using COMAdmin
using System.Runtime.InteropServices;
_serverName = myRemoteServer;
_partionName = myPartionName;
_message = myMessage;
ICOMAdminCatalog2 catalog = new COMAdminCatalog();
catalog.Connect(_serverName);
string moniker = string.Empty;
string MsgInClassId = "E3BD1489-30DD-4380-856A-12B959502BFD";
//we are using partitions
if (!string.IsNullOrEmpty(_partitionName))
{
COMAdminCatalogCollection partitions = catalog.GetCollection("Partitions");
partitions.Populate();
string partitionId = string.Empty;
foreach (ICatalogObject item in partitions)
{
if (item.Name == _partitionName)
{
partitionId = item.Key;
break;
}
}
if (!string.IsNullOrEmpty(partitionId) )
{
moniker = $"partition:{partitionId}/new:{new Guid(MsgInClassId)}";
try
{
var M = (IMsgInManager)Marshal.BindToMoniker(moniker);
M.AddMsg(_message);
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 这一直是我的想法.我可以通过按Ctrl+ Shift+ 打开任务管理器,Esc然后在第二个选项卡(进程)上,我可以轻松按下Alt + S- 显示所有用户的进程以提升我的任务管理器,而无需任何提示.瞧,我有一个强大的工具可以玩.我一直无法找到任何解释这个问题的文件,我对如何实现这一壮举感到非常好奇; 因为按钮实际上应该要求提示但不提示.
我正在通过将Windows消息直接发送到HWND并调用自动化应用程序公开的COM服务器来实现一些自动化.
如果有多个实例正在运行,我需要能够确定COM服务器的进程ID,这样我可以使用COM调用命中相同的实例作为我发送Windows消息的实例.
我可以使用正在运行的对象表枚举所有正在运行的COM服务器,并为所有这些服务器返回monikers,但COM对象本身不会公开任何可用于获取窗口句柄,线程ID,进程ID或任何类型的方法.
有没有办法弄清楚,基于名字对象或名字对象的实际绑定COM对象,COM服务器的进程ID是什么?
谢谢!
我有两个用C++和ATL编写的COM对象.有一个库,我知道他们的IID和CLID.
我找不到在两个简单COM对象之间进行这种简单通信的示例.如何创建IMoniker以及如何将其添加到ROT?然后,如何在不同的进程/线程中的其他COM中检索此对象的指针?
有没有人可以提供一个小例子?
编辑:更多信息:
我正在为IE写一个附加组件.有两个完全无关的COM对象,即IE加载用于不同目的.一个是BHO(Browser Helper Obect),另一个是异步可插拔协议(APP),我发现我可以通过ROT 在这里进行通信.
我刚刚意识到有一个shell:URI,但每个搜索引擎似乎都认为shell:和shell是一回事.
我发现的唯一一件事就是你可以shell:startup在资源管理器(XP和7测试版)中输入正确的效果.
这已经很好,因为没有%startup%,但我想知道这还有什么能力.
有没有MS参考?
编辑(即使它不在MSDN上)
moniker ×10
com ×5
c# ×3
uac ×3
winapi ×3
activation ×2
elevation ×2
protocols ×2
atl ×1
browser ×1
c ×1
com+ ×1
com-server ×1
explorer ×1
javascript ×1
shell ×1
uri ×1
visual-c++ ×1
windows ×1
windows-7 ×1