Обертка C# и Обратные вызовы

Я нахожусь в процессе записи обертки C# для светового сигнала Dallmeier Common API (Системы Camera & Surviellance), и я никогда не писал обертку прежде, но я использовал обертку EDSDK C# Canon. Таким образом, я использую обертку 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
- ПУСТОЙ УКАЗАТЕЛЬ
- strPwd1/2 - пароли обоих пользователей. Если strUser2 является ПУСТЫМ strPwd2, проигнорирован.

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

Обратный вызов
параметры будут структурированы:
- неподписанный длинный ulFunctionID
- неподписанные длинные ulSocketHandle,//обрабатывают к сокету установленного соединения
- неподписанный длинный ulWindowHandle,
- международный SessionHandle,//дескриптор сессии сессии создается
- символ константы * полоса,
- символ константы* strUser1,
- символ константы* strPwd1,
- символ константы* strUser2,
- символ константы * 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
    }


}

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

5
задан SLaks 12 March 2010 в 04:13
поделиться

1 ответ

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

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

3
ответ дан 15 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: