社区
C#
帖子详情
麻烦中:C#用不了IDispatch 。 请进来讨论解决方案。
Lostinet
2002-04-09 11:52:26
我想用XML来封装一种简单脚本(类似XSL的)
但是如果要做到这点,
就需要调用Animation的IDispatch。
但是我找来找去都找不到C#处理IDispatch的方法
(因为C#没有指针)(以前有人抱怨C#没有指针,我还骂人呢,真对不起了)
我想用C++做个中间COM来进行处理。
所以请大家一起商量解决方案。
...全文
507
9
打赏
收藏
麻烦中:C#用不了IDispatch 。 请进来讨论解决方案。
我想用XML来封装一种简单脚本(类似XSL的) 但是如果要做到这点, 就需要调用Animation的IDispatch。 但是我找来找去都找不到C#处理IDispatch的方法 (因为C#没有指针)(以前有人抱怨C#没有指针,我还骂人呢,真对不起了) 我想用C++做个中间COM来进行处理。 所以请大家一起商量解决方案。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qqchen79
2002-04-12
打赏
举报
回复
我尝试了一下,并不麻烦,而且VB.NET编译的Assembly DLL与C#的互操作性更好些,我想。
VB.NET支持LateBinding是由于它的Runtime (Microsft.VisualBasic)中实现了很多附加的功能,这里是一个完整的程序:
Option Explicit On
Option Strict Off
Imports System
Imports Microsoft.VisualBasic
Module Hello
Sub Main()
Dim obj As Object
obj = CreateObject("Word.Application")
Console.WriteLine(obj.Version)
End Sub
End Module
我不确定是否可以在C#里面using Microsoft.VisualBasic,然后用Late Binding。
Lostinet
2002-04-11
打赏
举报
回复
那我干脆用JScript.Net好了。
qqchen79
2002-04-11
打赏
举报
回复
原来是要用late binding,那就没办法了:p,这可是C#的大弱项。
当然,理论上说reflection可以办到,但是... #@$@#
不过在.NET的范围内还是可以解决的,VB.NET比C#的优点之一就是late binding,所以只要用vb.net就好了,不用C++介入,编程也方便许多。
可以用VB.NET编译个独立的DLL,吧这部分功能封装起来...
VB.NET我也不是很熟,这是MSDN上的一个例子:
Dim xlApp As Object
xlApp = CreateObject("Excel.Application")
MsgBox(xlApp.Version)
...
qqchen79
2002-04-10
打赏
举报
回复
如果你确信需要使用的是XMLDOM组件的话,TlbImp.exe已经足够了。
tlbimp c:\winnt\system32\msxml3.dll
然后你的目录下会有一个MSXML2.dll,用ildasm查以下,还用Idispatch吗?:)
XMLDocument doc = new XMLDocument();
doc.async = ...;
cmpp
2002-04-10
打赏
举报
回复
我来学习一下
Lostinet
2002-04-10
打赏
举报
回复
谢谢你的回复。
你提供的方法,只是把IDispatch压进一个对象中。
并且该对象提供获取IDispatch指针的方法而已。
----------
我希望的不是C#代码作为IDispatch传递的媒介。
而是想直接用C#调用IDispatch::Invoke
例如我希望用C#来实现下面代码:
STDMETHODIMP CTest::LoadXMLDocument(/*[in]*/BSTR szURL,/*[out,retval]*/LPDISPATCH *lplpDisp)
{
// TODO: Add your implementation code here
HRESULT hres;
CLSID clsidXMLDOM;
hres=CLSIDFromProgID(L"Microsoft.XMLDOM",&clsidXMLDOM);
if(FAILED(hres))
return hres;
LPDISPATCH lpDisp;
hres=CoCreateInstance(clsidXMLDOM,NULL,CLSCTX_INPROC_SERVER,IID_IDispatch,(LPVOID*)&lpDisp);
if(FAILED(hres))
return hres;
BSTR rgszNames[]={L"async",L"load"};
DISPID Dispid;
DISPPARAMS dps;
VARIANT params[1];
dps.cArgs=1;
dps.cNamedArgs=0;
dps.rgdispidNamedArgs=NULL;
dps.rgvarg=params;
VARIANT vres;
EXCEPINFO ei;
UINT rgui[2];
//xmldom.async=false;
hres=lpDisp->GetIDsOfNames(IID_NULL,&rgszNames[0],1,GetSystemDefaultLCID(),&Dispid);
if(FAILED(hres))
{
lpDisp->Release();
return hres;
}
params[0].vt=VT_BOOL;
params[0].boolVal=FALSE;
hres=lpDisp->Invoke(Dispid,IID_NULL,GetSystemDefaultLCID(),DISPATCH_PROPERTYPUT,&dps,&vres,&ei,rgui);
if(FAILED(hres))
{
lpDisp->Release();
return hres;
}
//xmldom.load(szURL);
hres=lpDisp->GetIDsOfNames(IID_NULL,&rgszNames[1],1,GetSystemDefaultLCID(),&Dispid);
if(FAILED(hres))
{
lpDisp->Release();
return hres;
}
params[0].vt=VT_BSTR|VT_BYREF;
params[0].pbstrVal=&szURL;
hres=lpDisp->Invoke(Dispid,IID_NULL,GetSystemDefaultLCID(),DISPATCH_METHOD,&dps,&vres,&ei,rgui);
if(FAILED(hres))
{
lpDisp->Release();
return hres;
}
*lplpDisp=lpDisp;
return S_OK;
}
qqchen79
2002-04-10
打赏
举报
回复
C#支持指针,尤其是与COM交互的接口指针。Marshal类可以帮你完成任何事。
如果只是简单的使用IDispatch,用MarshalAsAttribute就可以了:
In COM/IDL:
HRESULT FunctionNeedIDispatch([in] IDispatch* disp);
HRESULT FunctionRetIDispatch([out, retval] IDispatch** pdisp);
In C#:
void FunctionNeedIDispatch([MarshalAs(UnmanagedType.IDispatch)] Object o);
[MarshalAs(UnmanagedType.IDispatch)]
Object FunctionRetIDispatch();
...
当然,这也要看你具体使用IDispatch的场合,总的来说,你cast成某个CoClass或者其它的Interface (用tlbimp声明的)。
Lostinet
2002-04-10
打赏
举报
回复
不是啊。。
我的意思是,
如过我有一个XML脚本如下:
<var name="url" type="string">
<set-value><value type="string">http://www.host.com/thexml.xml</value></set-value>
</var>
<var name="test" type="object">
<set-value><active-x-object>Microsoft.XMLDOM</active-x-object></set-value>
</var>
<set-property>
<caller><getvar name="test" /></caller>
<property name="async"></property>
<value type="boolean">false</value>
</set-property>
<call-method>
<caller>
<get-var name="test" />
</caller>
<method name="load">
</method>
<arguments>
<param type="string"><get-var name="url" /></param>
</arguments>
</call-method>
我要用这个脚本来处理一些事务(就象游戏脚本一样)
而且我要调用哪个Automation的东西都不知道。
所以我只能用IDispatch
Lostinet
2002-04-09
打赏
举报
回复
我参与的问题
Jiangsheng的CSDN Digest(March 4, 2006)
为了便于搜索,这里尽可能保留了论坛上
讨论
的原文,但是这并不表示本人赞同帖子
中
的表述方式和观点。CSDN
讨论
总结系列: Jiangsheng的CSDN Digest (Jan 21 2006)( http://blog.csdn.net/jiangsheng/archive/2006/03/05/615669.aspx) Jiangsheng的CSDN Digest
链接:MSDN UserNet等
Q我想知道如何在VC
中
实现可塌陷的PanelBar界面(类似于OutlookBar)? T可塌陷的PanelBar界面比outlookbar更有吸引力,Windows XP左边的导航工具面版就是采用这种风格,采用这种风格的应用程序也越来越多,比如各种杀毒软件,可能delphi提供的vcl组件可以简化这种操作,对于这种“傻瓜式”的实现我不喜欢。我还是想用C++,实现这种界面,而且我不喜欢附带额外的动
转
转自http://blog.csdn.net/jiangsheng/archive/2006/03/05/615714.aspx为了便于搜索,这里尽可能保留了论坛上
讨论
的原文,但是这并不表示本人赞同帖子
中
的表述方式和观点在c++
中
如何创建一个文件? (VC/MFC 基础类)已知IStream *pIStream取道内容,如何将pIStream内容写到一个文件
中
去?http:
一些vc开发浏览器及插件的资料
如何往IE工具条添加按钮 问题提出: 金山词霸、网络蚂蚁等软件安装后会向IE的工具条添加自己的按钮。按下按钮后还会作出相应的动作,这种功能是如何实现的呢?读完本文,您也可以将自己应用程序的按钮添加到IE的工具条
中
。 基本原理: 从IE5开始便允许我们向工具栏添加自己的按钮,其本质就是修改注册表,添加创建此按钮所需的信息。 实现步骤: 1.创建此按钮的GUID(globally uniq...
【COM编程】如何往IE工具条添加按钮
问题提出: 金山词霸、网络蚂蚁等软件安装后会向IE的工具条添加自己的按钮。按下按钮后还会作出相应的动作,这种功能是如何实现的呢?读完本文,您也可以将自己应用程序的按钮添加到IE的工具条
中
。 基本原理: 从IE5开始便允许我们向工具栏添加自己的按钮,其本质就是修改注册表,添加创建此按钮所需的信息。 实现步骤: 1.创建此按钮的GUID(globally unique identifie
C#
110,536
社区成员
642,578
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章