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接口屬性
/**//// <summary>
/// 目前正在校對的報紙
/// </summary>
string PaperCode ...{get;set;}
/**//// <summary>
/// 擷取sequence的校次的pdf路徑。
/// </summary>
/// <param name="sequence">目前校次</param>
/// <param name="path">路徑</param>
/// <returns>得到路徑是否成功</returns>
bool GetPdfPath(int sequence, out string path);
#endregion
}
//接口實作
[Guid("EB4CF432-0286-4ec1-9889-8BF3BDCB0882")]
public class ProofRead : IProofRead, IObjectSafety
...{
/**//// <summary>
/// 目前正在校對的報紙
/// </summary>
public string PaperCode
...{
get ...{ return _papercode; }
set ...{ _papercode = value; }
}
/**//// <summary>
/// 擷取sequence的校次的pdf路徑。
/// </summary>
/// <param name="sequence">校次</param>
/// <param name="path">路徑</param>
/// <returns>得到路徑是否成功</returns>
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了。
哈哈,就寫到這裡了,關于源碼,我會放到一個專業的控件開發論壇:
小強控件開發論壇。歡迎大家成為一員,為控件開發排疑解惑。
源代碼下載下傳