2010-10-26 56 views
2

我有用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#编程经验的人可以验证我是否正确或不正确地使用了该翻译,则可能会有所帮助。

回答

0

你说CoDeSys是ActiveX兼容的;你有没有尝试过使用COM互操作?

+0

我相信如此。您是否指的是检查项目中的复选框**属性>构建>为COM互操作**注册? – blastthisinferno 2010-11-01 16:01:33

0

似乎有3个主要选项;首先是设置COM互操作,您可以使用COM实例化您的C#控件/类。我相信如果你做一些搜索,你可以找到更多的信息。

第二个选项是让你的C++模块混托管/非托管,如下所述: http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/5345a27a-a614-4a74-9f6d-ea7a999ddf83/

第三种选择是使用“反向的PInvoke”如下所述:http://tigerang.blogspot.com/2008/09/reverse-pinvoke.html

可能有其他选择;那些是我所知道的。