我正在尝试构建一个 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)
有什么我忽略了吗?谢谢。
我已经阅读并看到了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对象的基本理解,我做错了什么?
我需要创建一个显示 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.