Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将C结构封送到C中#_C#_C_Marshalling_Cen Xfs - Fatal编程技术网

C# 将C结构封送到C中#

C# 将C结构封送到C中#,c#,c,marshalling,cen-xfs,C#,C,Marshalling,Cen Xfs,我试图在C中调用一个函数,该函数具有以下来自C的签名# 我的C#代码如下所示: [DllImport("msxfs")] public static extern int WFSGetInfo(ushort hService, uint dwCategory, IntPtr lpQueryDetails, uint dwTimeOut, ref WFSRESULT lppResult); [StructLayout(LayoutKind.Explicit)] public struct WFS

我试图在
C
中调用一个函数,该函数具有以下来自C的签名#

我的
C#
代码如下所示:

[DllImport("msxfs")]
public static extern int WFSGetInfo(ushort hService, uint dwCategory, IntPtr lpQueryDetails, uint dwTimeOut, ref WFSRESULT lppResult);

[StructLayout(LayoutKind.Explicit)]
public struct WFSRESULT
{
   [FieldOffset(0)]
   public uint RequestID;
   [FieldOffset(4)]
   public ushort hService;
   [FieldOffset(6)]
   public SYSTEMTIME tsTimestamp;
   [FieldOffset(22)]
   public int hResult;
   [FieldOffset(26)]
   public uint dwCommandCode;
   [FieldOffset(26)]
   public uint dwEventID;
   [FieldOffset(30)]
   public IntPtr lpBuffer; //It should be pointer to a structure that contain more information
}

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
   public ushort wYear;
   public ushort wMonth;
   public ushort wDayOfWeek;
   public ushort wDay;
   public ushort wHour;
   public ushort wMinute;
   public ushort wSecond;
   public ushort wMilliseconds;
}

[StructLayout(LayoutKind.Sequential)]
public struct WFSPINSTATUS
{
   public ushort fwDevice;
   public ushort fwEncStat;
   public string lpszExtra;
   [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
   public uint[] dwGuidLights;
   public ushort fwAutoBeepMode;
   public uint dwCertificateState;
   public ushort wDevicePosition;
   public ushort usPowerSaveRecoveryTime;
}

private void WfsGetInfo()
{
   WFSRESULT wfsRESULT = new WFSRESULT();

   int hResult = WFSGetInfo(_lphService, InfoCommands.WFS_INF_PIN_CAPABILITIES, IntPtr.Zero, WFS_INDEFINITE_WAIT, ref wfsRESULT);

   WFSPINSTATUS pinStatus = Marshal.PtrToStructure<WFSPINSTATUS>(wfsRESULT.lpBuffer);
}
[DllImport(“msxfs”)]
公共静态外部内部WFSGetInfo(ushort hService、uint dwCategory、IntPtr lpQueryDetails、uint dwTimeOut、ref WFSRESULT lppResult);
[StructLayout(LayoutKind.Explicit)]
公共结构WFSRESULT
{
[字段偏移量(0)]
公共uint请求ID;
[现场偏移(4)]
公共卫生服务;
[现场偏移(6)]
公共系统时间戳;
[行政长官(22)]
公共卫生成果;
[附件(26)]
公共uint命令代码;
[附件(26)]
公共uint-dwEventID;
[现场偏移(30)]
public IntPtr lpBuffer;//它应该是指向包含更多信息的结构的指针
}
[StructLayout(LayoutKind.Sequential)]
公共结构系统时间
{
公共卫生服务;
公共卫生服务(每月);
公共卫生服务;
公共卫生日;
公共卫生;
公共卫生服务:15分钟;
公共卫生服务;
公共ushort Wmillists;
}
[StructLayout(LayoutKind.Sequential)]
公共结构状态
{
公共设备;
公共卫生局;
公共字符串lpszExtra;
[Marshallas(UnmanagedType.ByValArray,SizeConst=32)]
公共uint[]DWGUIDLIGHT;
公共ushort模式;
公共不动产;
公共场所;
公共卫生服务;公共卫生服务;
}
私有无效WfsGetInfo()
{
WFSRESULT WFSRESULT=新的WFSRESULT();
int hResult=WFSGetInfo(\u lphsservice,InfoCommands.WFS\u INF\u PIN\u CAPABILITIES,IntPtr.Zero,WFS\u unfinite\u WAIT,ref wfsRESULT);
WFSPINSTATUS pinStatus=Marshal.PtrToStructure(wfsRESULT.lpBuffer);
}
我的问题是,无论何时调用
WFSGetInfo
函数,它都会成功(
hResult==0
),但在
wfsRESULT
将被填充,所有其他值将为0(默认值),当我尝试将
lpBuffer
转换为
WFSPINSTATUS
时,出现以下异常。
System.NullReferenceException:“对象引用未设置为对象的实例。”

我认为问题不在被调用的dll
msxfs
中,因为它是一个标准的windows dll

我尝试了很多解决方案和技术(例如,我尝试将
SYSTEMTIME
布局设置为
Explicit
),但结果相同;我不会添加我的试用来缩短代码

我在
C
中做了很多关于封送结构和联合的搜索,下面的站点非常有用


我不确定这些信息是否有用,但我正在构建一个与EPP设备集成的
CEN/XFS

(如果您在研究中遗漏了它)。lpBuffer是否为空?如果为空,则输入参数不会返回任何数据。如果返回零,则表明输入有效,但不一定有任何结果。如果lpBuffer不为null,则它指向非托管内存,并且需要使用Marshal.PtrToStructure来获取结构WFSPINSTATUS@jdweng
lpBuffer
的值为
0x00000000
。正如文档所述,函数返回的结果应该在
hResult
中返回。我尝试将它的值设置为100,以确保在发送它之前它不是默认值,并且当它返回时它的值仍然是100。文档中关于hResult的值是100的说法是什么?@jdweng文档表明hResult值将类似于函数返回的值。当我调用函数时,它返回0,这意味着成功,hResult值也将为0。我不确定hResult是否已成功填充,或者它是否返回0,因为它是in的默认值,所以我在发送请求之前将其值设置为100,然后返回原样,这意味着封送处理未填充它。
[DllImport("msxfs")]
public static extern int WFSGetInfo(ushort hService, uint dwCategory, IntPtr lpQueryDetails, uint dwTimeOut, ref WFSRESULT lppResult);

[StructLayout(LayoutKind.Explicit)]
public struct WFSRESULT
{
   [FieldOffset(0)]
   public uint RequestID;
   [FieldOffset(4)]
   public ushort hService;
   [FieldOffset(6)]
   public SYSTEMTIME tsTimestamp;
   [FieldOffset(22)]
   public int hResult;
   [FieldOffset(26)]
   public uint dwCommandCode;
   [FieldOffset(26)]
   public uint dwEventID;
   [FieldOffset(30)]
   public IntPtr lpBuffer; //It should be pointer to a structure that contain more information
}

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
   public ushort wYear;
   public ushort wMonth;
   public ushort wDayOfWeek;
   public ushort wDay;
   public ushort wHour;
   public ushort wMinute;
   public ushort wSecond;
   public ushort wMilliseconds;
}

[StructLayout(LayoutKind.Sequential)]
public struct WFSPINSTATUS
{
   public ushort fwDevice;
   public ushort fwEncStat;
   public string lpszExtra;
   [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
   public uint[] dwGuidLights;
   public ushort fwAutoBeepMode;
   public uint dwCertificateState;
   public ushort wDevicePosition;
   public ushort usPowerSaveRecoveryTime;
}

private void WfsGetInfo()
{
   WFSRESULT wfsRESULT = new WFSRESULT();

   int hResult = WFSGetInfo(_lphService, InfoCommands.WFS_INF_PIN_CAPABILITIES, IntPtr.Zero, WFS_INDEFINITE_WAIT, ref wfsRESULT);

   WFSPINSTATUS pinStatus = Marshal.PtrToStructure<WFSPINSTATUS>(wfsRESULT.lpBuffer);
}