Я нахожусь в процессе написания оболочки 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 ожидает возвращаемого значения?