Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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# .NET CF、Interop&;GPS_设备结构_C#_Compact Framework_Interop - Fatal编程技术网

C# .NET CF、Interop&;GPS_设备结构

C# .NET CF、Interop&;GPS_设备结构,c#,compact-framework,interop,C#,Compact Framework,Interop,我正在尝试使用.NET CF 3.5中的结构,但调用GPSGetDeviceState时不断返回一个错误(87)。据我所知,87表示无效参数,但我不知道哪个参数无效 有谁能告诉我,我的代码哪里做错了,因为我已经花了两个晚上的大部分时间都一无所获 简单的测试用例是 NativeMethods.GpsDevice gpsDevice = new NativeMethods.GpsDevice(); int result = NativeMethods.GPSGetDeviceState(ref gp

我正在尝试使用.NET CF 3.5中的结构,但调用
GPSGetDeviceState
时不断返回一个错误(87)。据我所知,87表示无效参数,但我不知道哪个参数无效

有谁能告诉我,我的代码哪里做错了,因为我已经花了两个晚上的大部分时间都一无所获

简单的测试用例是

NativeMethods.GpsDevice gpsDevice = new NativeMethods.GpsDevice();
int result = NativeMethods.GPSGetDeviceState(ref gpsDevice);
我的互操作定义如下

private const string GpsApi = @"gpsapi.dll";

private const int GPS_VERSION_1 = 1;
private const int GPS_MAX_SATELLITES = 12;
private const int GPS_MAX_PREFIX_NAME = 16;
private const int GPS_MAX_FRIENDLY_NAME = 64;

[DllImport(GpsApi)]
public static extern int GPSGetDeviceState(ref GpsDevice pGPSDevice);

[StructLayout(LayoutKind.Sequential)]
public class GpsDevice {

public UInt32 dwVersion;

 public UInt32 dwSize;

 public IoctlServiceStatus dwServiceState;

 public IoctlServiceStatus dwDeviceState;

 public FileTime ftLastDataReceived;

 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.GPS_MAX_PREFIX_NAME)]
 public string szGPSDriverPrefix;

 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.GPS_MAX_PREFIX_NAME)]
 public string szGPSMultiplexPrefix;

 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NativeMethods.GPS_MAX_FRIENDLY_NAME)]
 public string szGPSFriendlyName;

 public GpsDevice() {

  this.dwVersion = NativeMethods.GPS_VERSION_1;
  this.dwSize = (UInt32)Marshal.SizeOf(this);

 }

}

[StructLayout(LayoutKind.Sequential)]
public struct FileTime {
 UInt32 dwLowDateTime;
 UInt32 dwHighDateTime;
}

public enum IoctlServiceStatus : uint {

 Off = 0,

 On = 1,

 StartingUp = 2,

 ShuttingDown = 3,

 Unloading = 4,

 Uninitialised = 5,

 Unknown = 0xffffffff

}
我希望我已经包括了所有可能需要的信息;如果没有,请提示我更多


提前感谢。

将GpsDevice定义为struct而不是class,然后使用封送类将其封送到非托管代码

请参见此处有关如何将struct转换为pionter和pionter的示例


将GpsDevice定义为struct而不是class,然后使用封送类将其封送到非托管代码

请参见此处有关如何将struct转换为pionter和pionter的示例


我将GpsDevice的定义从一个类更改为一个结构,它可以工作

[StructLayout(LayoutKind.Sequential)]
public struct GpsDevice {
...

}
但是,我必须删除构造函数(这实际上是我首先将其编码为类的原因,这样我就可以自动初始化dwSize和dwVersion成员)


真遗憾,你不能在结构上有构造函数

我将GpsDevice的定义从类更改为结构,它可以正常工作

[StructLayout(LayoutKind.Sequential)]
public struct GpsDevice {
...

}
但是,我必须删除构造函数(这实际上是我首先将其编码为类的原因,这样我就可以自动初始化dwSize和dwVersion成员)


真遗憾,你不能在结构上有构造函数

您对StructureToPtr和PtrToStructure的引用是正确的,并且也适用于类和结构(+1)。然而,我期望/希望能够将结构作为参数传递给GPSGetDeviceState API——这似乎是我的解决方案失败的地方。也就是说,线索可能在API定义中。。。DWORD GPSGetDeviceState(GPS_设备*pGPSDevice);这似乎期待一个指针!它不适用于类,只适用于struct。这就是它被称为StructureToPtr而不是ObjectToPtr的原因。您对StructureToPtr和PtrToStructure的引用是正确的,并且也适用于类和结构(+1)。然而,我期望/希望能够将结构作为参数传递给GPSGetDeviceState API——这似乎是我的解决方案失败的地方。也就是说,线索可能在API定义中。。。DWORD GPSGetDeviceState(GPS_设备*pGPSDevice);这似乎期待一个指针!它不适用于类,只适用于struct。这就是为什么它被称为StructToPtr,而不是ObjectToPtr。structs有构造函数Allen-对不起,也许我应该更具体一些。我希望结构可以有无参数构造函数。只需添加一个静态创建方法,封装结构大小和版本的初始化,并返回一个新的结构实例。结构有构造函数Allen-对不起,也许我应该更具体一些。我希望结构可以有无参数构造函数。只需添加一个静态Create方法,它封装了结构大小和版本的初始化,并返回一个新的结构实例。