C# .NET CF、Interop&;GPS_设备结构
我正在尝试使用.NET CF 3.5中的结构,但调用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
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方法,它封装了结构大小和版本的初始化,并返回一个新的结构实例。