0

C#関数を呼び出すc++プロジェクトがあり、その後、c#はc++関数を呼び出します(両方とも戻り値付き)。私はスタックオーバーフローの誰かが私にくれた COM インターフェイスで立ち往生しています (私は C++ または C# の経験があまりなく、Java だけです)、何らかの理由で C++ コードをコンパイルしようとするとエラーが発生し、致命的なエラー C1196 が発生します: 'FaceTrackingBasics-WPF': タイプ ライブラリにある識別子 c:\FaceTrackingBasics-WPF/bin/x86/Debug/FaceTrackingBasics-WPF.tlb' は有効な C++ 識別子ではありません。

エラーを見つけることができますか?1 つのファイルに 2 つのクラスを含めるべきではないのでしょうか。ところで、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();
 }
4

1 に答える 1

0
'FaceTrackingBasics-WPF' : ... is not a valid C++ identifier

そうではありません。C++ 識別子にダッシュ「-」を含めることはできません。ところでC#のように。この名前はプロジェクト名に由来します。タイプ ライブラリ名を設定します。#import ディレクティブが作成した名前空間の名前を設定します。

プロジェクトの名前を変更するだけでなく、考えられるいくつかの回避策。#import ディレクティブに属性を適用できます。「auto-rename」、「no-namespace」、「rename-namespace」のように:

   #import "FaceTrackingBasics-WPF.tlb" rename_namespace("managed")
   using namespace managed;
于 2013-03-09T20:38:37.667 に答える