IDispatch接口 - Part IV - 跨语言调用

当一个COM接口支持IDispatch的时候(Dual接口),它就可以被其他语言调用。

这里我用perl试了一下。

perl测试代码

  1. use warnings; 
  2. use strict; 
  3. use Win32::OLE; 
  4.  
  5. use constant ADS_UF_ACCOUNTDISABLE => 2; 
  6. use constant ADS_SCOPE_SUBTREE => 2; 
  7.  
  8. my $MyCom = Win32::OLE->new( "MyCom.MyCar" ) or die("Can't create object for MyCom");        
  9.  
  10. print "MyCom object:".$MyCom."\n"; 
  11.  
  12. my $total = 0
  13.   
  14. $MyCom->AddGas(3, \$total);    
  15. $MyCom->AddGas(4, \$total);  
  16.  
  17. print "Total gas: ".$total."\n"; 
  18.  
  19. my $Gas = $MyCom->{"Gas"}; 
  20.  
  21.  
  22. print "Remain gas = ".$Gas."\n";  
use warnings;
use strict;
use Win32::OLE;

use constant ADS_UF_ACCOUNTDISABLE => 2;
use constant ADS_SCOPE_SUBTREE => 2;

my $MyCom = Win32::OLE->new( "MyCom.MyCar" ) or die("Can't create object for MyCom");       

print "MyCom object:".$MyCom."\n";

my $total = 0;
 
$MyCom->AddGas(3, \$total);   
$MyCom->AddGas(4, \$total); 

print "Total gas: ".$total."\n";

my $Gas = $MyCom->{"Gas"};


print "Remain gas = ".$Gas."\n"; 
代码很简单,调用两次AddGas,然后读取com对象的属性。运行结果:


加了2次3和4,最终输出7,对。

但是这里有个问题,AddGas的第二个参数是输出参数,这里我不知道怎么填写,这个输出参数现在不工作。我没怎么花时间去查perl,但是从COM调用的角度来讲,已经成功了。


相关COM代码

  1. STDMETHODIMP CMyCar::Run() 
  2.     // TODO: Add your implementation code here 
  3.  
  4.     return S_OK; 
  5.  
  6.  
  7. STDMETHODIMP CMyCar::AddGas(LONG add, LONG* total) 
  8.     // TODO: Add your implementation code here 
  9.     m_Gas += add; 
  10.     *total = m_Gas
  11.  
  12.     return S_OK; 
  13.  
  14.  
  15. STDMETHODIMP CMyCar::get_Gas(LONG* pVal) 
  16.     // TODO: Add your implementation code here 
  17.     *pVal = m_Gas
  18.  
  19.     return S_OK; 
STDMETHODIMP CMyCar::Run()
{
    // TODO: Add your implementation code here

    return S_OK;
}


STDMETHODIMP CMyCar::AddGas(LONG add, LONG* total)
{
    // TODO: Add your implementation code here
    m_Gas += add;
    *total = m_Gas;

    return S_OK;
}


STDMETHODIMP CMyCar::get_Gas(LONG* pVal)
{
    // TODO: Add your implementation code here
    *pVal = m_Gas;

    return S_OK;
}
注册表文件rgs:

  1. HKCR 
  2.     MyCom.MyCar.1 = s 'MyCar Class' 
  3.     { 
  4.         CLSID = s '{5220D0BC-4702-43F9-9960-2D8ABE91896C}' 
  5.     } 
  6.     MyCom.MyCar = s 'MyCar Class' 
  7.     { 
  8.         CLSID = s '{5220D0BC-4702-43F9-9960-2D8ABE91896C}' 
  9.         CurVer = s 'MyCom.MyCar.1' 
  10.     } 
  11.  
  12.     NoRemove CLSID 
  13.     { 
  14.         ForceRemove {5220D0BC-4702-43F9-9960-2D8ABE91896C} = s 'MyCom.MyCar' 
  15.         { 
  16.             ProgID = s 'MyCom.MyCar.1' 
  17.             VersionIndependentProgID = s 'MyCom.MyCar' 
  18.  
  19.             ForceRemove Programmable 
  20.             InprocServer32 = s '%MODULE%' 
  21.             { 
  22.                 val ThreadingModel = s 'Apartment' 
  23.             } 
  24.             TypeLib = s '{4B2C6C73-AD0D-466D-936D-B6BD8E7F7A2F}' 
  25.             Version = s '1.0' 
  26.         } 
  27.     } 
HKCR
{
	MyCom.MyCar.1 = s 'MyCar Class'
	{
		CLSID = s '{5220D0BC-4702-43F9-9960-2D8ABE91896C}'
	}
	MyCom.MyCar = s 'MyCar Class'
	{
		CLSID = s '{5220D0BC-4702-43F9-9960-2D8ABE91896C}'
		CurVer = s 'MyCom.MyCar.1'
	}

	NoRemove CLSID
	{
		ForceRemove {5220D0BC-4702-43F9-9960-2D8ABE91896C} = s 'MyCom.MyCar'
		{
			ProgID = s 'MyCom.MyCar.1'
			VersionIndependentProgID = s 'MyCom.MyCar'

			ForceRemove Programmable
			InprocServer32 = s '%MODULE%'
			{
				val ThreadingModel = s 'Apartment'
			}
			TypeLib = s '{4B2C6C73-AD0D-466D-936D-B6BD8E7F7A2F}'
			Version = s '1.0'
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值