#import .NET进程外服务器的问题

时间:2020-03-05 18:39:59  来源:igfitidea点击:

在C ++程序中,我正在尝试#import NET进程外服务器的TLB。

我收到如下错误:

z:\server.tlh(111) : error C2146: syntax error : missing ';' before identifier 'GetType'
  
  z:\server.tlh(111) : error C2501: '_TypePtr' : missing storage-class or type specifiers
  
  z:\server.tli(74) : error C2143: syntax error : missing ';' before 'tag::id'
  
  z:\server.tli(74) : error C2433: '_TypePtr' : 'inline' not permitted on data declarations
  
  z:\server.tli(74) : error C2501: '_TypePtr' : missing storage-class or type specifiers
  
  z:\server.tli(74) : fatal error C1004: unexpected end of file found

TLH看起来像:

_bstr_t GetToString();
VARIANT_BOOL Equals (const _variant_t & obj);
long GetHashCode();
_TypePtr GetType();
long Open();

我对拥有GetType(),Equals()等基础对象.NET对象方法并不真正感兴趣。但是GetType()似乎引起了问题。

谷歌的一些研究表明,我可以#import mscorlib.tlb(或者将其放在路径中),但是我也无法将其编译。

有小费吗?

解决方案

回答

在我的#import中添加了no_namespace和raw_interfaces_only:

#import "server.tlb" no_namespace named_guids

也可以使用TLBEXP.EXE而不是REGASM.EXE来解决此问题。

回答

另外,请确保Cclass没有此属性:

[ClassInterface(ClassInterfaceType.AutoDual)] <-似乎使用_TypePtr在C ++中引起错误

回答

更通常地,
vs何时将com来源编译为tlb
里面会有这样的提示:
// #import" C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorlib.tlb"
我们应该在#inport youOwn.tlb之前将其添加到StdAfx.h
基本属性,例如
_Type,_ObjRef将在项目中添加为原型类型

我认为,它将解决问题。

但更大的问题是:
完成所有操作后,在程序中调用Ptr时会出现一些运行时错误

有人可以帮忙吗?

回答

看来我们需要使用

[ClassInterface(ClassInterfaceType.None)]

这是关于类似问题的另一讨论。

回答

#import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb" was the solution for me.