郑昀记录 200409
C#写的组件,一般C++无法调用。除非在C#中这么做:
第一步,修改HTMLParser工程属性:
Build信息页中“Register for COM interop”设置为True。
第二步,在class特意声明:
namespace HTMLParser { [Guid(" 1F 6EBDEF-1111-2222 -86F 2-0CEF0ED302E0")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface _ParseHTML { [DispId(1)] String GetVersion();
[DispId(2)] String GetLastError();
[DispId(3)] String ParseFile(String strRegularExpression); }
[Guid("C 11113C 6 -23F 3-4db5-2222-BF5BD 95A 5C 81")] [ClassInterface(ClassInterfaceType.None)] [ProgId("HTMLParser.ParseHTML")] public class ParseHTML : _ParseHTML {。。。 |
这样,就能够像调用一个普普通通的COM组件一样了。
当然在Visual C++调用该组件时也需要第三个技巧:
/// /// /// 对于这种特殊的C#写的COM组件,必须以特殊方式调用 HTMLParser::_ParseHTML *com_ptr_Parser; HTMLParser::_ParseHTMLPtr pPaser(__uuidof(HTMLParser::ParseHTML)); com_ptr_Parser = pPaser; _bstr_t bstrXMLFilePath = com_ptr_Parser->ParseFile( _bstr_t(strRegularExpression.c_str())); |
更多信息参见《Creating a CCW for COM enabled non .NET applications》
(Nick Parker http://www.codeproject.com/dotnet/nettocom.asp)。
郑昀记录 200409
C#写的组件,一般C++无法调用。除非在C#中这么做:
第一步,修改HTMLParser工程属性:
Build信息页中“Register for COM interop”设置为True。
第二步,在class特意声明:
namespace HTMLParser { [Guid(" 1F 6EBDEF-1111-2222 -86F 2-0CEF0ED302E0")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface _ParseHTML { [DispId(1)] String GetVersion();
[DispId(2)] String GetLastError();
[DispId(3)] String ParseFile(String strRegularExpression); }
[Guid("C 11113C 6 -23F 3-4db5-2222-BF5BD 95A 5C 81")] [ClassInterface(ClassInterfaceType.None)] [ProgId("HTMLParser.ParseHTML")] public class ParseHTML : _ParseHTML {。。。 |
这样,就能够像调用一个普普通通的COM组件一样了。
当然在Visual C++调用该组件时也需要第三个技巧:
/// /// /// 对于这种特殊的C#写的COM组件,必须以特殊方式调用 HTMLParser::_ParseHTML *com_ptr_Parser; HTMLParser::_ParseHTMLPtr pPaser(__uuidof(HTMLParser::ParseHTML)); com_ptr_Parser = pPaser; _bstr_t bstrXMLFilePath = com_ptr_Parser->ParseFile( _bstr_t(strRegularExpression.c_str())); |
更多信息参见《Creating a CCW for COM enabled non .NET applications》
(Nick Parker http://www.codeproject.com/dotnet/nettocom.asp)。
郑昀记录 200409
C#写的组件,一般C++无法调用。除非在C#中这么做:
第一步,修改HTMLParser工程属性:
Build信息页中“Register for COM interop”设置为True。
第二步,在class特意声明:
namespace HTMLParser { [Guid(" 1F 6EBDEF-1111-2222 -86F 2-0CEF0ED302E0")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface _ParseHTML { [DispId(1)] String GetVersion();
[DispId(2)] String GetLastError();
[DispId(3)] String ParseFile(String strRegularExpression); }
[Guid("C 11113C 6 -23F 3-4db5-2222-BF5BD 95A 5C 81")] [ClassInterface(ClassInterfaceType.None)] [ProgId("HTMLParser.ParseHTML")] public class ParseHTML : _ParseHTML {。。。 |
这样,就能够像调用一个普普通通的COM组件一样了。
当然在Visual C++调用该组件时也需要第三个技巧:
/// /// /// 对于这种特殊的C#写的COM组件,必须以特殊方式调用 HTMLParser::_ParseHTML *com_ptr_Parser; HTMLParser::_ParseHTMLPtr pPaser(__uuidof(HTMLParser::ParseHTML)); com_ptr_Parser = pPaser; _bstr_t bstrXMLFilePath = com_ptr_Parser->ParseFile( _bstr_t(strRegularExpression.c_str())); |
更多信息参见《Creating a CCW for COM enabled non .NET applications》
(Nick Parker http://www.codeproject.com/dotnet/nettocom.asp)。