首页  ·  知识 ·  
Label
      编辑:  图片来源:网络

1.问题的提出。
   我们公司的系统一开始是用VC6.0开发的,现在的程序是用C#2.0 vs2005开发的,两个程序之间要进行互相调用。

为了好写命名VC6的com叫 mark.ocx C#的ActiveX叫npr.dll

mark.ocx 要调npr.dll来得到一个文件,当文件打开的时候,文件菜单上就会出现mark.ocx,像批注一样的功能,

批注完成以后,npr.dll要把mark.ocx产生的批注信息放到DataBase里面,就是这样一个调用过程。

2.下面是代码片段

//接口
 [Guid("BC5969B4-518A-4590-B332-94BAAAF1C24A")]
    
public interface IProofRead
    ...{
        PDF接口属性
#region PDF接口属性

        
/**//// 
        
/// 当前正在校对的报纸
        
/// 

        string PaperCode ...{get;set;}
      
/**//// 
        
///  获取sequence的校次的pdf路径。
        
/// 

        
/// 当前校次
        
/// 路径
        
/// 得到路径是否成功
        bool GetPdfPath(int sequence, out string path); 
       

        
        
#endregion
    }
 
//接口实现
[Guid("EB4CF432-0286-4ec1-9889-8BF3BDCB0882")]
    
public class ProofRead : IProofRead, IObjectSafety
    ...{
       
/**//// 
        
/// 当前正在校对的报纸
        
/// 

        public string PaperCode 
        ...{
            
get ...{ return _papercode; }
            
set ...{ _papercode = value; }
        }
 
/**//// 
        
///  获取sequence的校次的pdf路径。
        
/// 

        
/// 校次
        
/// 路径
        
/// 得到路径是否成功
        public bool GetPdfPath(int sequence, out string path)
        ...{
          
//some to do
         }
}

 

下面是VC6调用的代码:


#if 0
#include 
<iostream.h>

#import 
"..ProofPdfCom/ProofPdfCom.tlb"  no_namespace
#pragma comment(lib, "comsupp.lib")
#include 
"comutil.h"
 
void main(void)
{
    
// 声明HRESULT和Simple_ATL接口指针
    HRESULT hr;
    IProofPdfProxy 
*IFirstATL = NULL;
    
    
// 初始化COM
    hr = CoInitialize(0);
    
    
// 使用SUCCEEDED 宏并检查我们是否能得到一个接口指针 
    if(SUCCEEDED(hr))
    {
        hr 
= CoCreateInstance( CLSID_ProofPdfProxy, NULL, CLSCTX_INPROC_SERVER,
            IID_IProofPdfProxy, (
void**&IFirstATL);
        
        
// 如果成功,则调用AddNumbers方法,否则显示相应的出错信息
        if(SUCCEEDED(hr))
        {

                                                               
string b;
            IFirstATL
->Getpdf(1,&b);
            IFirstATL
->Release(); 
        }
        
else
        {
            cout 
<< "CoCreateInstance Failed." << endl;
        }
    
//    cin.get();
    }
    
// 释放COM
    CoUninitialize();
}

#endif

3.关于调试

用C#写的com由于与系统不是同一直进程,没法调试,现在给大家介绍一个好用的调试信息工具;

Dbgview.exe

用法:

[DllImport("KERNEL32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
        
private static extern void OutputDebugString(char[] lpText);
        
public static void SpellerViewLog(string errorPlace)
        {
            
#if DEBUG
            errorPlace 
= "调试信息:" + errorPlace;
                        OutputDebugString(errorPlace.ToCharArray());
            
#endif
        }
        
public void load()
        {

             SpellerViewLog(
"xxx");

       }

 

在运行程序的时候,就打开Dbgview.exe,就可以看到:调试信息:xxx了。

哈哈,就写到这里了,关于源码,我会放到一个专业的控件开发论坛:

小强控件开发论坛。欢迎大家成为一员,为控件开发排疑解惑。

源代码下载

本文作者:海尔比斯特 来源:http://www.cnblogs.com/HeroBeast/
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的
收藏至微信