У меня есть элемент управления ActiveX, написанный на C # и работающий при запуске в программе, совместимой с ActiveX (CoDeSys). Проблема, с которой я столкнулся, заключается в том, что для того, чтобы CoDeSys мог взаимодействовать с элементом управления ActiveX, CoDeSys требует, чтобы dll экспортировала прототип функции:
void ExecuteActiveXCall(IUnknown* pUnk, char* pszId, char* pszParam, char* pszReturnBuffer, int nReturnBufferSize, DWORD* pdwReturnFlag);
Я безуспешно посмотрел, как экспортировать это, как вы можете в C ++, как показано в этом примере:
extern "C" __declspec (dllexport) void ExecuteActiveXCall(IUnknown* pUnk, char* pszId, char* pszParam, char* pszReturnBuffer, int nReturnBufferSize, DWORD* pdwReturnFlag)
{
if (strcmp(pszId, "IWebBrowser|GoBack") == 0)
{
IUnknown* pNewUnk;
IWebBrowser* pwb;
pUnk->QueryInterface(IID_IWebBrowser, (void**) &pNewUnk);
pwb = (IWebBrowser*) pNewUnk;
if (pwb)
{
pwb->GoBack();
pwb->Release();
}
}
else if (strcmp(pszId, "IWebBrowser|GoForward") == 0)
{
IUnknown* pNewUnk;
IWebBrowser* pwb;
pUnk->QueryInterface(IID_IWebBrowser, (void**) &pNewUnk);
pwb = (IWebBrowser*) pNewUnk;
if (pwb)
{
pwb->GoForward();
pwb->Release();
}
}
}
C # имеет ключевое слово extern , но оно не позволяет вам дать определение функции (по крайней мере, я не нашел способа). После попытки этого:
extern unsafe void ExecuteActiveXCall(
[MarshalAs(UnmanagedType.IUnknown)] object pUnk,
char* pszId,
char* pszParam,
char* pszReturnBuffer,
int nReturnBufferSize,
UInt32* pdwReturnFlag)
{
}
Произошла следующая ошибка:
'AlarmsCSharp.AlarmsControl.ExecuteActiveXCall(object, char*, char*, char*, int, uint*)' cannot be extern and declare a body
Кто-нибудь пытался экспортировать функцию в C # dll?
Есть ли обходные пути? (У меня была мысль о [DllImport ("AlarmsCSharp.dll")] и о вызове C # в dll C ++, но я решил, что у меня будет решение, если у кого-то было раньше)
Возможно, я слишком много думаю об этом, и мне не нужно экспортировать эту функцию, поскольку элемент управления ActiveX уже может взаимодействовать с кодом C #.
РЕДАКТИРОВАТЬ: Я чувствую, мой перевод от прототипа функции C ++ к объявлению интерфейса C #. Если кто-то с большим опытом программирования на C ++ / C # сможет убедиться, что я сделал этот перевод правильным или неправильным, это может помочь.