爱编程的叶一笑 2024-08-28 13:07 采纳率: 50%
浏览 7
已结题

如何解决VS2022下使用RDP Control控件出现ASSERT报错?

在Windows10操作系统中,我使用Visual Studio 2022的MFC项目(基于对话框)试图去编写一个调用Microsoft RDP Client Control的Demo程序。我在对话框编辑器中添加了显式控件,随后我在手动使用regsvr32.exe分别对System32和SysWow64目录下的Mstscax.dll注册后启动了程序实例。可以确定的是,自动生成的rc文件中的CLSID使用的是微软官方文档所给出的CLISD,但却在进入InitDiaglog函数之前便弹出:

img


更换多次RDP Control版本都无济于事。
根据调试得到报错位置:

img

根据进一步调试得知,在AEESET被调用之前,还出现了错误码为0x80040111的警告输出,使用错误查找获得结果如下:

img

  • 写回答

1条回答 默认 最新

  • 清水白石008 2024-08-28 18:38
    关注
    🕒下午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“最伟大的荣耀不在于从不跌倒,而在于每次跌倒后都能站起来。” — 纳尔逊·曼德拉
    

    在使用 Microsoft RDP Client Control (Mstscax.dll) 时遇到 ASSERT 报错,尤其是在 Visual Studio 2022 的 MFC 项目中,可能是由于多个原因导致的。以下是一些可能的解决方案和调试步骤,帮助您解决这个问题。

    1. 确保正确注册控件

    确保您已经正确注册了 Mstscax.dll。在 Windows 10 中,您可以使用以下命令注册 DLL:

    regsvr32 "C:\Windows\System32\Mstscax.dll"
    regsvr32 "C:\Windows\SysWOW64\Mstscax.dll"
    

    确保在以管理员身份运行命令提示符时执行这些命令。

    2. 检查 COM 组件的 CLSID

    确保在您的资源文件(.rc 文件)中使用的 CLSID 是正确的。您可以在 Microsoft 的官方文档中找到最新的 CLSID。确保它与您注册的控件匹配。

    3. 确保 MFC 项目设置正确

    • 使用 Unicode:确保您的项目设置为使用 Unicode 字符集,因为 RDP 控件可能依赖于 Unicode。
    • MFC 动态链接:确保您的项目使用动态链接的 MFC 库,而不是静态链接。

    4. 检查 RDP 控件的版本

    确保您使用的 RDP 控件版本与您的操作系统和 Visual Studio 版本兼容。某些版本的 RDP 控件可能在特定的 Windows 版本上存在问题。

    5. 调试信息

    • 错误代码 0x80040111:这个错误代码表示 "Class not registered"。这通常意味着 COM 组件没有正确注册。请确保您在正确的目录中注册了 DLL,并且没有权限问题。
    • **使用 CoInitialize**:在使用 COM 控件之前,确保在您的应用程序中调用 CoInitializeCoInitializeEx。例如:
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr)) {
        // 处理错误
    }
    

    6. 示例代码

    以下是一个简单的示例,展示如何在 MFC 对话框中使用 RDP 控件:

    #include <afxwin.h>
    #include <afxext.h>
    #include <comdef.h>
    #include <mstscax.h> // 确保包含 RDP 控件的头文件
    
    class CMyDialog : public CDialogEx {
    public:
        CMyDialog() : CDialogEx(IDD_MYDIALOG) {}
    
        virtual BOOL OnInitDialog() {
            CDialogEx::OnInitDialog();
    
            // 初始化 COM
            HRESULT hr = CoInitialize(NULL);
            if (FAILED(hr)) {
                // 处理错误
                return FALSE;
            }
    
            // 创建 RDP 控件
            CComPtr<IMsTscAx> pRDPControl;
            hr = pRDPControl.CoCreateInstance(__uuidof(MsTscAx));
            if (FAILED(hr)) {
                // 处理错误
                return FALSE;
            }
    
            // 设置控件属性
            // pRDPControl->put_...
    
            return TRUE;
        }
    
        virtual void OnOK() {
            // 清理
            CoUninitialize();
            CDialogEx::OnOK();
        }
    };
    
    // 应用程序入口
    class CMyApp : public CWinApp {
    public:
        virtual BOOL InitInstance() {
            CMyDialog dlg;
            m_pMainWnd = &dlg;
            dlg.DoModal();
            return FALSE;
        }
    };
    
    CMyApp theApp;
    

    7. 其他建议

    • 查看事件日志:检查 Windows 事件查看器中的应用程序日志,可能会有更详细的错误信息。
    • 更新 Visual Studio:确保您的 Visual Studio 2022 是最新版本,某些问题可能在更新中得到解决。
    • 查阅文档和社区:查看 Microsoft 的官方文档和开发者社区,可能会有其他开发者遇到类似问题并分享解决方案。

    总结

    通过确保正确注册控件、检查 CLSID、设置 MFC 项目、处理 COM 初始化和错误代码,您应该能够解决 RDP 控件的 ASSERT 报错问题。如果问题仍然存在,请提供更多的错误信息和上下文,以便进行更深入的分析和建议。希望这些建议能帮助您解决问题!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月6日
  • 已采纳回答 8月29日
  • 修改了问题 8月28日
  • 修改了问题 8月28日
  • 展开全部

悬赏问题

  • ¥15 webstorm上开发的vue3+vite5+typeScript打包时报错
  • ¥15 vue使用gojs,需求在link中的虚线上添加方向箭头
  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥100 求ASMedia ASM1184e & ASM1187e 芯片datasheet/规格书
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL