gpt4 book ai didi

c# - P/通过损坏的名称调用函数

转载 作者:行者123 更新时间:2023-11-30 20:10:38 24 4
gpt4 key购买 nike

我正在尝试在 Windows CE 6.0 环境中的 .net cf 3.5 中调用非托管 C++ dll 中的函数。

结构定义为:

typedef struct TagOperatorInfo
{
DWORD dwMode;
DWORD dwFormat; //Operator name format
DWORD dwAct; //Network type(Available in 3G module£ºGSM or 3G),
TCHAR szOper[32];
}OperatorInfo,*LPOperatorInfo;

函数调用是:

BOOL GetCurOperatorInfo(LPOperatorInfo pinfo);

我在 .net 中定义的 TagOperatorInfo 如下:

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public struct TagOperatorInfo
{

/// DWORD->unsigned int
public uint dwMode;

/// DWORD->unsigned int
public uint dwFormat;

/// DWORD->unsigned int
public uint dwAct;

/// TCHAR[32]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 32)]
public string szOper;
}

在看到一些文章和 msdn 文档后,我将 native 函数称为:

[System.Runtime.InteropServices.DllImportAttribute(gsmaAdapterDLLName, EntryPoint = "#30", CallingConvention = CallingConvention.Winapi)]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
internal static extern bool GetCurOperatorInfo([MarshalAs(UnmanagedType.LPStruct)] ref NativeHelper.TagOperatorInfo operatorInfo);

注意:我使用序号定义的入口点调用该函数,因为 C++ 损坏了名称。

我遇到的问题是我总是抛出 notSupportedException。我不明白,因为 ref 参数应该给它指向结构的指针。

调用它的我的 .net 函数是:

/// <summary>
/// Gets the current operator information.
/// </summary>
/// <param name="operatorInfo">The operator info.</param>
/// <returns></returns>
public static bool GetOperatorInformation(out NativeHelper.TagOperatorInfo operatorInfo)
{
operatorInfo = new NativeHelper.TagOperatorInfo();

if (NativeImports.GetCurOperatorInfo(ref operatorInfo) == true)
{
return true;
}
else
{
return false;
}

}

我缺少什么才能正常工作。

更新

新的 .Net Compact Framework 方法调用

[System.Runtime.InteropServices.DllImportAttribute(gsmaAdapterDLLName, EntryPoint = "?GetCurOperatorInfo@CGSMAdapter@@YAHPAUTagOperatorInfo@@@Z", CallingConvention = CallingConvention.Winapi)]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
internal static extern bool GetCurOperatorInfo([MarshalAs(UnmanagedType.LPStruct)]ref NativeHelper.TagOperatorInfo operatorInfo);

最佳答案

您只能调用已导出为 C 样式函数的函数。据我所知,您不能通过 P/Invoke 直接调用 C++ 函数,例如:

How to set up a C++ function so that it can be used by p/invoke?

更新

实际上,在通过 P/Invoke 调用函数时,您确实可以使用错位名称。这是我过去永远做不到的事情,所以我接受了纠正。使用名称而不是序数也应该更有弹性:

引用:Entry Point Not Found Exception

所以像这样:

[DllImport(gsmaAdapterDLLName,
EntryPoint="?GetCurOperatorInfo@CGSMAdapter@@YAHPAUTagOperatorInfo@@@Z",
ExactSpelling = true,
CallingConvention = CallingConvention.Cdecl)]
public static extern bool GetCurOperatorInfo(out TagOperatorInfo info);

对于 .Net CF:

DllImport(gsmaAdapterDLLName,
EntryPoint="?GetCurOperatorInfo@CGSMAdapter@@YAHPAUTagOperatorInfo@@@Z",
CallingConvention = CallingConvention.WinApi)]
public static extern bool GetCurOperatorInfo(out TagOperatorInfo info);

关于c# - P/通过损坏的名称调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4804494/

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