我有用C#编写的ActiveX控件,并且在ActiveX兼容程序(CoDeSys)中运行时工作。我遇到的问题是,为了让CoDeSys的与ActiveX控件进行交互,CoDeSys的要求DLL导出的函数原型:在C#中定义extern“C”功能
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#中的C++的dll,但想我会看看是否有人收到了一个解决方案)
也许我是在想这并且不需要导出此函数,因为ActiveX控件已经能够与C#代码进行交互。
编辑:我有一种感觉,我从C++函数原型转换到C#接口声明。如果有更多C++/C#编程经验的人可以验证我是否正确或不正确地使用了该翻译,则可能会有所帮助。
我相信如此。您是否指的是检查项目中的复选框**属性>构建>为COM互操作**注册? – blastthisinferno 2010-11-01 16:01:33