Visual studio RegisterActiveObject在服务器上返回成功,但GetObject在任何客户端上都不工作?

Visual studio RegisterActiveObject在服务器上返回成功,但GetObject在任何客户端上都不工作?,visual-studio,com,atl,Visual Studio,Com,Atl,我已经在创建一个简单的exe COM服务器上工作了2天,我已经在网络上测试了任何东西,但仍然不工作! 我用ATL创建了一个简单的对象,并用ATL RegisterClassObjects和RegisterActiveObject注册了接口,它返回SUCCESS,但任何客户端都不能使用GetObject方法获取对象,但CreateObject可以工作 这是我的项目文件: 有人能帮我吗?我真的需要它,它是我项目的一部分。 谢谢。首先,你需要检查你是否成功地将你的东西放到了ROT上。寻找irotvi

我已经在创建一个简单的exe COM服务器上工作了2天,我已经在网络上测试了任何东西,但仍然不工作! 我用ATL创建了一个简单的对象,并用ATL RegisterClassObjects和RegisterActiveObject注册了接口,它返回SUCCESS,但任何客户端都不能使用GetObject方法获取对象,但CreateObject可以工作

这是我的项目文件:

有人能帮我吗?我真的需要它,它是我项目的一部分。
谢谢。

首先,你需要检查你是否成功地将你的东西放到了ROT上。寻找
irotview
(一些旧的SDK?)或类似的实用程序来确保这一点(更新-让你得到它)

如果条目在那里(或者您需要检查创建ROT条目的API调用的错误代码),则客户端有两种可能无法访问条目的选项:

  • 安全性-没有访问该条目的权限;至少当您以管理员凭据和提升的权限启动服务器和客户端时,情况就不应该是这样了
  • 封送-您需要确保您的接口可以封送;最简单的方法是从IDispatch派生它并注册类型库;如果不封送,COM将无法为接口创建代理/存根对

  • 我终于用这段代码解决了我的问题:(CoreRegisterClassObject仍然不工作!)

    HRESULT-hr;
    CYourObject*your=new-ccombject();
    void*p=NULL;
    您的->查询界面(IID\U IUnknown,&p);
    IUnknown*var=(IUnknown*)p;
    德沃德博士;
    IRunningObjectTable*保护;
    IMoniker*pMon;
    LPOLESTR monikerName;
    hr=GetRunningObjectTable(NULL,&pROT);
    hr=StringFromCLSID(CLSID\u对象和monikerName);
    LPOLESTR delim=L“!”;//名字对象分隔符(设置为!始终)
    hr=CreateItemMoniker(delim、monikerName和pMon);
    hr=pROT->Register(ROTFLAGS\u registationkeepsalive、var、pMon和pdwRegister);
    CLSID id;
    hr=CLSIDFromProgID(L“MyAtlProject.YourObject”、&id);
    
    根据OP的问题,我无法评论此答案的适用性,但我非常感谢@Roman回来编辑答案并提供RotView的工作链接。
    HRESULT hr;
    CYourObject *your = new CComObject<CYourObject>();
    void *p = NULL;
    your->QueryInterface(IID_IUnknown,&p);
    IUnknown *var = (IUnknown*)p;
    DWORD pdwRegister;
    
    
    IRunningObjectTable *pROT;
    IMoniker *pMon;
    LPOLESTR monikerName;
    hr = GetRunningObjectTable(NULL,&pROT);
    
    hr = StringFromCLSID(CLSID_YourObject, &monikerName);
    
    LPOLESTR delim = L"!"; // moniker delimiter (set to ! always)
    hr = CreateItemMoniker(delim,monikerName,&pMon);
    
    hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE,var,pMon,&pdwRegister);
    CLSID id;
    hr = CLSIDFromProgID(L"MyAtlProject.YourObject",&id);