我正在处理WMI连接错误和超时,并将尝试首先检查RPC堆栈。我找到了以下C代码段,但不了解它是否以及如何工作以及在哪里可以找到更多信息甚至样本。

RPC_STATUS状态;
无符号的短* StringBinding;
RPC_BINDING_HANDLE BindingHandle;
状态= RpcStringBindingCompose
(
NULL,//对象UUID
L“ncacn_ip_tcp”,//要使用的协议(protocol)序列
L“MyServer.MyCompany.com”,//服务器DNS或Netbios名称
空值,
空值,
&字符串绑定(bind)
);
//省略错误检查。如果没有错误,请执行以下操作
状态= RpcBindingFromStringBinding(StringBinding,&BindingHandle);

//不受RpcBindingFromStringBinding的错误影响而释放字符串
RpcStringFree(&StringBinding);

此代码是否真的建立了连接?
有人对C#有互操作声明吗?

到目前为止谢谢。

布拉马

最佳答案

这是您上面的示例的互操作代码:

class Rpc
{
    [DllImport("Rpcrt4.dll", CharSet = CharSet.Auto)]
    public static extern int RpcStringBindingCompose(
        string ObjUuid,
        string ProtSeq,
        string NetworkAddr,
        string EndPoint,
        string Options,
        out string StringBinding);

    [DllImport("Rpcrt4.dll", CharSet = CharSet.Auto)]
    public static extern int RpcBindingFromStringBinding(
        string StringBinding,
        out IntPtr Binding);

    [DllImport("Rpcrt4.dll", CharSet = CharSet.Auto)]
    public static extern int RpcBindingFree(
        ref IntPtr Binding);

    public Rpc()
    {
        string stringBinding = null;

        int retCode = RpcStringBindingCompose(
             null,                // Object UUID
             "ncacn_ip_tcp",      // Protocol sequence to use
             "MyServer.MyCompany.com", // Server DNS or Netbios Name
             null,
             null,
             out stringBinding );

        IntPtr bindingHandle = IntPtr.Zero;
        retCode = RpcBindingFromStringBinding(stringBinding, out bindingHandle);

        retCode = RpcBindingFree(ref bindingHandle);
    }
}

09-30 14:38