gpt4 book ai didi

c# - 在 C# 中定义 extern "C"函数

转载 作者:太空宇宙 更新时间:2023-11-03 16:50:53 24 4
gpt4 key购买 nike

我有一个用 C# 编写的 ActiveX 控件,在 ActiveX 兼容程序 (CoDeSys) 中运行时可以正常工作。我遇到的问题是,为了让 CoDeSys 与 ActiveX 控件交互,CoDeSys 需要 dll 导出函数原型(prototype):

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++ 函数原型(prototype)到 C# 接口(interface)声明的翻译。如果有更多 C++/C# 编程经验的人可以验证我的翻译是否正确,这可能会有所帮助。

最佳答案

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

关于c# - 在 C# 中定义 extern "C"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4027914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com