我有一个.Net asm,它使用[ComVisible(true)]属性向COM公开了几个接口和类。我生成一个tlb,然后在我的StdAdx文件中在C ++ COM组件中引用它。奇怪的是,由于某种原因,即使非常基本的智能感知(VS6 for C ++)能够看到我的属性和方法,我也会收到编译错误,指出它们不是成员。例如:
[Guid("88E58BE4-E0CB-4d1b-9553-A5431E7A0BEA")]
[ComVisible(true)]
public interface ISupplierPayment : IBusinessObjectPersist
{
String Comment
{
get;
set;
}
在c ++生成的tlh中:
struct __declspec(uuid("e94bd31e-327c-33c8-8a55-b693ccf1ed96"))
struct __declspec(uuid("e94bd31e-327c-33c8-8a55-b693ccf1ed96"))
ISupplierPayment : IDispatch
{
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall get_Comment (
BSTR * pRetVal ) = 0;
最后在代码中尝试使用它时出错:
D:\ MR ... File.cpp(647):错误C2039:'评论':不是'ISupplierPayment'的成员 d:\ mr ... projectdir \ release \ TheDotNetClasses.tlh(758):参见'ISupplierPayment'的声明
我接下来应该注意什么?如果它在tlh并且intellisense识别它并且它在tlb的OLEView中存在,我不确定什么可能是错误的...感谢提前看看
更新 相关问题的进一步示例: C#
[Guid("3BE93D52-86B7-42e6-BAE6-29037F6BC9C4")]
[ComVisible(true)]
public interface IDataStoreFactory
{
void TestMethod(String test);
C ++ TLH
struct __declspec(uuid("3be93d52-86b7-42e6-bae6-29037f6bc9c4"))
IDataStoreFactory : IDispatch
{
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall TestMethod (
BSTR dataStoreAssembly ) = 0;
void TestMethod(String test);
C ++方法调用
spDataStoreFactory->TestMethod("test");
C ++编译错误
'TestMethod':无法将参数1从'char [5]'转换为'unsigned short *' 指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换
咦!?它不是短暂的BSTR ......现在很困惑
答案 0 :(得分:0)
您没有显示生成错误消息的调用。我想你直接使用了属性名称。
您需要使用方法get_Comment
而不是简单的Comment
属性。生成的tlh指的是该方法。您是否使用了raw_interfaces_only
指令的#import
属性?
稍后编辑BSTR:
BSTR是wchar_t*
的typedef。所以请使用spDataStoreFactory->TestMethod( SysAllocString(L"test"));