使用c#从c++访问COM接口会产生错误
Using COM interfaces C# to access from c++ produces error
我有一个c++项目,它将调用一个c#函数,然后c#将调用一个c++函数(都有返回值)。我被困在COM接口,有人在这里stackoverflow给了我(我没有太多的经验在c++或c#,只有java),但由于某种原因,它给了我一个错误,当我试图编译c++代码,致命错误C1196: 'FaceTrackingBasics-WPF':标识符在类型库c:FaceTrackingBasics-WPF/bin/x86/Debug/FaceTrackingBasics-WPF。tlb'不是一个有效的c++标识符。
你能发现一些错误吗?也许我不应该在一个文件中有两个类?顺便说一句,c#代码与窗口相关联,我不知道它是否会导致问题。由于
c#代码 // -------------------------------------------------------------------------------- ------------------------------------
// <copyright file="FaceTrackingViewer.xaml.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
// -------------------------------------------------------------------------------- ------------------------------------
namespace FaceTrackingBasics
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Microsoft.Kinect;
using Microsoft.Kinect.Toolkit.FaceTracking;
using System.Globalization;
/////
using System.Runtime.InteropServices;
using Point = System.Windows.Point;
/// <summary>
/// Class that uses the Face Tracking SDK to display a face mask for
/// tracked skeletons
/// </summary>
public partial class FaceTrackingViewer : UserControl, IDisposable
{
public static readonly DependencyProperty KinectProperty = DependencyProperty.Register(
"Kinect",
typeof(KinectSensor),
typeof(FaceTrackingViewer),
new PropertyMetadata(
null, (o, args) => ((FaceTrackingViewer)o).OnSensorChanged((KinectSensor)args.OldValue, (KinectSensor)args.NewValue)));
private const uint MaxMissedFrames = 100;
private Boolean drawFlat = false;
public FaceTrackingViewer()
{
this.InitializeComponent();
}
~FaceTrackingViewer()
{
this.Dispose(false);
}
public KinectSensor Kinect
{
get
{
return (KinectSensor)this.GetValue(KinectProperty);
}
set
{
this.SetValue(KinectProperty, value);
}
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
//i deleted the rest of the code, i dont think its relevant
}
}
//***********************//
[ComVisible(true)]
[Guid("2EF06BCB-A25B-41AD-B233-33A956DBEB69")]
public struct Ponto
{
public double x;
public double y;
public Ponto(double x, double y)
{
this.x = x;
this.y = y;
}
}
[ComVisible(true)]
[Guid("EB9258F5-DCFB-4F91-8342-5A05EB17557D")]
public interface IManagedClass
{
Ponto[] Foo();
}
[ComVisible(true)]
[Guid("11B23AD7-F79E-45D7-BC87-89F0DBC8B83F")]
[ClassInterface(ClassInterfaceType.None)]
public class ManagedClass : IManagedClass
{
private List<Ponto> points;
public ManagedClass()
{
points = new List<Ponto>();
points.Add(new Ponto(1.0, 1.0));
points.Add(new Ponto(2.0, 2.0));
points.Add(new Ponto(3.0, 3.0));
}
public Ponto[] Foo()
{
return points.ToArray();
}
}
c++代码 #include "stdafx.h"
#import "C:/Users/Pedro/Dropbox/0000000TESE/000_visual_studio/0FaceTMS/FaceTrackingBasics- WPF/bin/x86/Debug/FaceTrackingBasics-WPF.tlb"
#include <iostream>
using namespace FaceTrackingBasics;
using namespace std;
int main()
{
::CoInitialize(NULL);
{
IManagedClassPtr pManagedClass(__uuidof(ManagedClass));
SAFEARRAY* psa = pManagedClass->Foo();
Ponto* pPoints = (Ponto*)psa->pvData;
for (int i = 0; i < 3; ++i)
cout << pPoints[i].x << " " << pPoints[i].y << endl;
}
::CoUninitialize();
}
'FaceTrackingBasics-WPF' : ... is not a valid C++ identifier
不是,c++标识符不能包含破折号"-"。顺便说一句,就像c#一样。这个名字来自你的项目名称。设置类型库名称。它设置了#import指令创建的命名空间的名称。
除了简单地重命名项目之外,还有几个可能的解决方法。你可以在#import指令中应用属性。如"auto-rename", "no-namespace"answers"rename-namespace":
#import "FaceTrackingBasics-WPF.tlb" rename_namespace("managed")
using namespace managed;
相关文章:
- 尝试向 COM 对象添加另一个接口时出现静态强制转换错误 C2440
- 在接口文件中使用模板时出现"not a type"错误的函数指针
- 为什么在取消引用的指向接口的指针上使用赋值运算符不是编译器错误
- BASIC_SOCKETD_ACCEPTOR接口在Boost 1.66中更改.这是一个错误
- 错误:在 C++ 中实现接口模式时未定义对 typeinfo 的引用
- 错误"未在作用域中声明",但带有接口
- 将C 节俭代码汇编为接口Cassandra会导致以下错误.我们在这里缺少什么
- C++接口引发未解决的外部符号错误
- Java 本机接口 GetStringUTFChars 致命错误
- Cython与C++接口:大型阵列的分段错误
- 编译错误外部接口Simulink
- 来自 vtable 的未定义符号是否意味着接口和实现之间存在错误
- 安装程序设备接口错误 259 用于显示
- MATLAB-C 接口:内存上的访问冲突错误
- 任何耶普的分段错误!接口调用
- 何时检查错误,使用 QIODevice 的阻塞接口(QTcpSocket 和 QFile)
- 错误:(E112) 获取接口失败:端口未绑定 - SystemC
- ATL 进程外回调接口上的'Interface not Registered'错误
- 错误MIDL2025:语法错误:应为接口
- 编译错误:找不到标头、类和类接口的任何问题