我在c#上有一个COM对象wtitten,我在c ++ dll中使用它。
在c ++中,使用#import
derective
问题是当从c ++ dll调用COM对象的任何函数时,我得到运行时检查错误:
运行时检查失败#0 - 未正确保存ESP的值 跨函数调用。这通常是调用a的结果 用一个带有函数指针的调用约定声明的函数 用不同的调用约定声明。
在c ++ import指令生成的com对象包装器中,所有函数都声明为__stdcall
答案 0 :(得分:1)
好的,看起来我找到了解决方案: 我已经为C#COM接口中的所有方法分解了In / Out / MarshalAs属性:
[Guid("EEB4C1AE-4DB2-4bdb-86D4-A429B27496A3")]
public interface IAXFarCards
{
[DispId(1)]
void InitDbConnection([In, MarshalAs(UnmanagedType.BStr)] string connectionString);
[DispId(2)]
[return: MarshalAs(UnmanagedType.I4)]
int GetCardInfo(
[In, MarshalAs(UnmanagedType.BStr)] string card,
[In, MarshalAs(UnmanagedType.VariantBool)] bool isTemplate,
[In, MarshalAs(UnmanagedType.I4)] int cashDeskId,
[Out, MarshalAs(UnmanagedType.VariantBool)] out bool isActive,
[Out, MarshalAs(UnmanagedType.I4)] out int discountNumber,
[Out, MarshalAs(UnmanagedType.I8)] out Int64 amount,
[In, Out, MarshalAs(UnmanagedType.BStr)] ref string ownerName,
[In, Out, MarshalAs(UnmanagedType.I4)] ref int clientId
);