标签: com

更改 CComVariant 变量的类型在 ATL 方法中不起作用

我正在尝试构建一个 ATL COM 类,它具有以下方法:

STDMETHODIMP CTestClass::TestMethod(VARIANT VarIn, VARIANT_BOOL* bRes)
{
    //VarIn is of type VT_INT

    CComVariant var(VarIn);
    var.ChangeType(VT_UI8); //doesn't work, HRESULT return value reports type mismatch
    ULONGLONG ullVal = var.ullVal; //wrong value is assigned
    *bRes = VARIANT_TRUE;
    return S_OK;
}
Run Code Online (Sandbox Code Playgroud)

问题是CComVariant实例的类型在方法内部没有改变。例如,如果我将基于 int 的值 123 传递给上述方法,则不会VT_UI8执行to 类型转换。

但是,如果CComVariant在独立函数中使用该类,则通过该ChangeType()方法更改类型可以完美地工作:

void Function()
{
    CComVariant var(123);
    var.ChangeType(VT_UI8); //ok
    ULONGLONG ullVal = var.ullVal; //correct value is assigned
}
Run Code Online (Sandbox Code Playgroud)

有什么我忽略了吗?谢谢。

c++ com atl

-2
推荐指数
1
解决办法
2244
查看次数

COM中的IDispatch和IUnkown有什么区别?

我已经阅读并看到了COM的示例,但是我不能清楚地看到那里的接口差异。

c++ com com-interface visual-c++

-2
推荐指数
1
解决办法
3042
查看次数

在foreach循环之后处理IDisisable COM对象包装的正确方法

foreach循环调用自动.dispose()实现的对象IDisposable.这是一个很好的功能,但是假设你有以下功能:

public COMWrapper GetCOMWrapperByName(string COMWrapperName)
{
    List<COMWrapper> COMWrapperList = GetCOMWrappersFromPlace();

    foreach(COMWrapper cw in COMWrapperList)
    {
        if(cw.name == COMWrapperName)
            return cs;
    }
}
Run Code Online (Sandbox Code Playgroud)

COMWrapper.dispose()方法发布它相关的COM对象.

据我所知,foreach循环将COMWrapper在循环结束时处理每个循环,但随后离开匹配,COMWrapper因为它在到达语句结束之前返回.

然而,对于列表中COMWrapper留下的引用,这成为一个问题,COMWrapperList因为它们中的一半已经删除了它们的底层COM对象RCW包装器而没有被丢弃.更糟糕的是,列表的剩余部分有完全不受管理的COM对象现在漂浮在以太网中,并且由于COMWrapper它们存在的对象尚未被处理掉,因此在一个声明中进行适当的遍历List和调用变得非常困难(我们不是毕竟,想要释放COM对象两次)..dispose()finally

是否可以确定是否已释放COM对象而不捕获ObjectDisposedException异常?是否有更好的方法来处理剩余的COM对象及其包装器?或者我可能完全误解了这种情况,需要重新评估我对COM对象的基本理解,我做错了什么?

c# com foreach idisposable rcw

-3
推荐指数
1
解决办法
396
查看次数

如何使用 Internet Explorer 控件在 Python 中创建 HTML 对话框窗口?

我需要创建一个显示 HTML 页面的对话框。该应用程序是用 Python 编写的,并且对话框必须包含 Internet Explorer 控件。Python 是否支持与 COM/ActiveX 集成?是否有此类集成的工作示例?

If possible please provide an answer without links to third-party websites. Please do not offer .NET/C++/Chrome or any other combinations. Python+IE is my requirement and can not be changed.

html python com internet-explorer activex

-4
推荐指数
1
解决办法
2087
查看次数