Оболочка C # и обратные вызовы - PullRequest
4 голосов
/ 12 марта 2010

Я нахожусь в процессе написания оболочки C # для Dallmeier Common API light (Системы Camera & Surviellance), и я никогда раньше не писал оболочку, но я использовал оболочку Canon EDSDK C #. Поэтому я использую оболочку Canon как руководство по написанию оболочки Dallmeier.

У меня сейчас проблемы с переносом обратного вызова. В руководстве API это имеет следующее:

dlm_connect

int(unsigned long uLWindowHandle,   
    const char * strIP,  
    const char* strUser1,  
    const char* strPwd1,  
    const char* strUser2,  
    const char* strPwd2,   
    void (*callback)(void *pParameters, void *pResult, void *pInput),   
    void * pInput)  

Аргументы
- ulWindowhandle - дескриптор окна, которое передается ViewerSDK для отображения видео и сообщений там
- strUser1 / 2 - имена пользователей, которые будут входить в систему. Если используется только один логин, strUser2 имеет значение
- NULL
- strPwd1 / 2 - пароли обоих пользователей. Если strUser2 равен NULL, strPwd2 игнорируется.

Возвращение
Эта функция создает SessionHandle, который должен быть передан

Обратный вызов
pParameters будет структурирован:
- без знака длинный ulFunctionID
- unsigned long ulSocketHandle, // дескриптор сокета установленного соединения
- unsigned long ulWindowHandle,
- int SessionHandle, // дескриптор сессии созданной сессии
- const char * strIP,
- const char * strUser1,
- const char * strPwd1,
- const char * strUser2,
- const char * strPWD2
pResult - указатель на целое число, представляющее результат операции. Ноль на успех. Отрицательные значения - это коды ошибок.

Итак, из того, что я прочитал в сети и переполнении стека, C # использует делегаты для обратных вызовов. Поэтому я создаю функцию обратного вызова:

public delegate uint DallmeierCallback(DallPparameters pParameters, IntPtr pResult, IntPtr pInput);

создаю функцию подключения

[DllImport("davidapidis.dll")]
public extern static int dlm_connect(int ulWindowHandle, string strIP, string strUser1, string strPwd1, string strUser2, string strPwd2, DallmeierCallback inDallmeierFunc

И (я думаю) DallPParameters как структура:

[StructLayout(LayoutKind.Sequential)]
public struct DallPParameters
{
  public int ulfunctionID;
  public int ulsocketHandle;
  public int ulWindowHandle;
  ...
}

Все это в моем классе-обёртке.
Я двигаюсь в правильном направлении или это совершенно неправильно?
Тогда в моем классе Dallmeier у меня есть следующее:

    private DallmeierAPI dallmeierAPI;  
    private DallmeierSDK.DallmeierCallback dallCallbackHandler;  
    private GCHandle handle;  
    private IntPtr pResult;  
    private IntPtr pInput;  

    internal Dallmeier()
    {
        this.dallmeierAPI = DallmeierAPI.Instance;

        registerEvents();
    }

    private void registerEvents()
    {
        // Register Callback Events
        dallCallbackHandler = new DallmeierSDK.DallmeierCallback(pParameters, pResult, pInput); // Error: Method Name expected

        handle = GCHandle.Alloc(dallCallbackHandler);
    }

    private void unregisterEvents()
    {
        handle.Free();
    }

    private DallmeierSDK.DallPParameters pParameters(int ulfunctionID, int ulSocketHandl, int ulWindowHandle, int SessionHandle, string strIP, string strUser1, string strPwd1, string strUser2, string strPwd)
    {
        // what goes in here : Error not all code paths return a value
    }


}

Итак, когда я регистрирую обратный вызов, он говорит, что ожидается имя метода?
и pParameters ожидает возвращаемого значения?

1 Ответ

2 голосов
/ 12 марта 2010

Вы в основном на правильном пути.

Однако C long s (я полагаю) 32-битные и отображаются на C # int s.
Кроме того, после вызова функции необходимо сохранить управляемую ссылку на экземпляр делегата, который вы передали, чтобы убедиться, что делегат не получает мусор.

...