①创建C#类库(ClassLibrary)、设置AssemblyInfo.cs中的[assembly: ComVisible(true)]默认是false、或者在接口和类之前添加设置为true
[ComVisible(true)]
[Guid("E709D3B9-18E8-4189-B1E0-49F72DD5A74C")]
public interface CombineToolInterface{
[DispId(1)]
bool CalcuHeight(Object files, ref float fHeight)
}
利用VS工具中的创建GUID生成GUID
②定义接口其中每个接口对应一个[DispId(1)] id必须唯一。
③具体实现
[ComVisible(true)]
[Guid("C76A4C63-46DE-4D3A-8DD7-00E71B42D9AA")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("PDFCombine.CombineToolInterface")]
public class CombineTool : CombineToolInterface{
bool CalcuHeight(Object files, ref float fHeight){
List<string> arrFile = new List<string>((string[])files);
return true;}
}
④默认情况下会生成.tlh和.dll文件,然后使用VS类向导添加类选择 MFC Class From TypLib..如下图:
有.h和dll文件VC就可以使用了。
注:若C#参数需要数组,则可以定义为Object,C++对应的是VARINT
eg.
在COM中传递数组需要SAFEARRY,但是SAFEARRY需要使用VARIANT包装一下,如下:
注:若C#参数需要数组,则可以定义为Object,C++对应的是VARINT
eg.
BOOL CalcuHeightWidth(VARIANT& files, float * fHeight) {
BOOL result;
static BYTE parms[] = VTS_VARIANT VTS_PR4 ;
return result;
}
在COM中传递数组需要SAFEARRY,但是SAFEARRY需要使用VARIANT包装一下,如下:
VARIANT arryVar;
VariantInit( &arryVar );
arryVar.vt = VT_ARRAY | VT_BSTR;
SAFEARRAY* pSa = SafeArrayCreateVector(VT_BSTR, 0, vecTmpFiles.size());
BSTR* bFile = new BSTR[vecTmpFiles.size()];
for (int i = 0; i < vecTmpFiles.size(); ++i)
{
bFile[i] = SysAllocString(vecTmpFiles.at(i));
SafeArrayPutElement(pSa,(long*)&i, bFile[i]);
}
SafeArrayAccessData(pSa, (void**)&bFile);
arryVar.parray = pSa;
SafeArrayUnaccessData(pSa);
SafeArrayDestroy(pSa); //会自动释放BSTR* bFile数组,无需再释放bFile,否则重复释放。