2014-10-27 4 views
-1

Я пытаюсь написать приложение на основе C#, использующее C++ DLL. Приложение C# предназначено для пользовательского интерфейса и имеет все преимущества WPF. В C++ DLL используются функции Win32 (например, для перечисления окон).Устранение неполадок с C++ для обработки в C#

Теперь я хочу, чтобы C++ DLL создавала событие, которое можно обрабатывать в приложении C#. Это то, что я пытался (на основе this article):

//cpp file 

#using <System.dll> 

using namespace System; 

struct WIN { 
    HWND Handle; 
    char ClassName; 
    char Title; 
}; 

delegate void wDel(WIN); 
event wDel^ wE; 
void GotWindow(WIN Window) { 
    wE(Window); 
} 

Когда я пытаюсь скомпилировать этот код, эти ошибки выбрасываются:

C3708: 'wDel': improper use of 'event'; must be a member of a compatible event source

C2059: syntax error: 'event'

C3861: 'wE': identifier not found

+0

Ключевое слово * event * должно отображаться внутри 'public ref class'. Кроме того, вы должны использовать управляемую 'value struct' вместо собственной' struct', чтобы код C# мог получить доступ к элементам структуры. –

ответ

0

Ваше мероприятие должно быть членом какой-то удалось класс, возможно, статический. например:

#include "stdafx.h" 
#include "windows.h" 

using namespace System; 

struct WIN { 
    HWND Handle; 
    char ClassName; 
    char Title; 
}; 

delegate void wDel(WIN); 

ref class WindowEvents abstract sealed // abstract sealed ref class in c++/cli is like a static class in c# 
{ 
    public: 
     static event wDel^ wE; 

     static void GotWindow(WIN Window) { 
      wE(Window); 
     } 
}; 

Update

Если вам нужно convert your unmanaged HWND to an IntPtr, поскольку IntPtr является standard P/Invoke signature for an HWND in c#, вы могли бы рассмотреть что-то вроде следующего:

#include "stdafx.h" 
#include "windows.h" 

using namespace System; 

#pragma managed(push,off) 

struct WIN { // Unmanaged c++ struct encapsulating the unmanaged data. 
    HWND Handle; 
    char ClassName; 
    char Title; 
}; 

#pragma managed(pop) 

public value struct ManagedWIN // Managed c++/CLI translation of the above. 
{ 
public: 
    IntPtr Handle; // Wrapper for an HWND 
    char ClassName; 
    char Title; 
    ManagedWIN(const WIN win) : Handle(win.Handle), ClassName(win.ClassName), Title(win.Title) 
    { 
    } 
}; 

public delegate void wDel(ManagedWIN); 

public ref class WindowEvents abstract sealed // abstract sealed ref class in c++/cli is like a static class in c# 
{ 
    public: 
     static event wDel^ wE; 

    internal: 
     static void GotWindow(WIN Window) { 
      wE(ManagedWIN(Window)); 
     } 
}; 

ManagedWIN Здесь содержит только безопасные .Net типы.

+1

используйте 'value struct' вместо' struct'. – ArthurCPPCLI

+0

@Jan Böhm - ответ обновляется с предложением от ArthurCPPCLI. – dbc

 Смежные вопросы

  • Нет связанных вопросов^_^