Member 10020245 Ответов: 0

Маршалинг обратных вызовов из C++ в C#


У меня есть SDK от третьей стороны-поставщика камер (Hasselblad), который предоставил SDK для подключения ПК к своей камере. SDK состоит из библиотеки DLL C++ и неуправляемого примера приложения C++, использующего эту библиотеку DLL. Я могу правильно упорядочить все методы в своем коде C#, кроме обратного вызова. Кроме того, пример приложения работает просто отлично из их неуправляемого исходного кода C++. Заголовок DLL для обратного вызова C++ выглядит следующим образом:

#define PHOCUS_API   __declspec( dllexport )
#define PHOCUS_API_CALL __stdcall
	typedef HRESULT (CALLBACK *STATUS_MESSAGE_CALLBACK )( void* ref, HRESULT hr, LPCWSTR pszMessage );
	PHOCUS_API HRESULT PHOCUS_API_CALL SetStatusMessageCallback( HANDLE hClient, STATUS_MESSAGE_CALLBACK pfnCallback, void* ref );


Что я уже пробовал:

У меня есть следующие операторы импорта в верхней части простой основной точки входа, а также определения делегатов и событий.

[DllImport("PhocusApi64.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 SetStatusMessageCallback(IntPtr hClient, STATUS_MESSAGE_CALLBACK PhocusMessageCallback, IntPtr refx);

public delegate Int32 STATUS_MESSAGE_CALLBACK(IntPtr refs, Int32 HRESULT, String szMessage);
public static event STATUS_MESSAGE_CALLBACK MessageResponse;


I use other DLL methods to create handles to the installed camera devices (PhocusDevices[0]). I can use these handles to do functions such as setting the aperture, getting the serial number etc. Also, I can command the camera to take a picture. The variable "Result" is returned from the DLL methods and indicate that the methods are working properly. In the sample application that I am replicating in the managed code, the CALLBACK fires properly and I can step into the C++ code. My C# code compiles w/o error and I can step through all the C# statements without exceptions. In the C# case, I cannot get the delegate to fire after commanding a image capture -- although I hear the camera trigger and can access the image. I have the following statements in my C# code.

    IntPtr Result = SetStatusMessageCallback(PhocusDevices[0], ResponseAfterImageDownload, (IntPtr)0);

static Int32 ResponseAfterImageDownload(IntPtr refs, Int32 HRESULT, String
    MessageResponse += ResponseAfterImageDownload;

static Int32 ResponseAfterImageDownload(IntPtr refs, Int32 HRESULT, String szMessage)
{
    int a = 0;
    // this method will be entered when we get a message from Phocus
    return 0;
}


Ваши мысли будут оценены по достоинству ...
Джим

0 Ответов