Я нахожусь в процессе записи обертки 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
}
}
Таким образом, когда я регистрирую обратный вызов его высказывание ожидаемого Имени метода?
и параметры ожидают возвращаемое значение?
Вы в основном на правильном пути.
Однако C long
являются (я считаю) 32-битными и отображаются в C # int
s.
Кроме того, после вызова функции вы должны сохранить управляемую ссылку на переданный вами экземпляр делегата, чтобы гарантировать, что делегат не будет собирать мусор.