2014-02-20 177 views
-1

我试图修改我的最终项目的Wiimote白板应用程序。但我在编程语言C#中的经验非常少。这些C#代码是什么意思?

我不知道几行代码的含义是什么。谁能帮我?

Guid HumanInterfaceDeviceServiceClass_UUID = new Guid(0x00001124, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); 

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = BLUETOOTH_MAX_NAME_SIZE)] 

public string szName; 
+6

如果您在C#中的经验很少,那么确实与蓝牙设备进行互操作是一种不好的方法。 – Aron

+0

我知道,但我陷入这种情况。 因此,我想学习和完成这个项目。 我希望有人能帮助并指导我解决它。 –

回答

0

MarshalAs用于托管和非托管代码之间的互操作。在C#中,string总是UTF-16。在C语言中,由于没有内置的字符串类型,你有时必须提示运行时本地代码的期望值(应该是ascii/unicode?char/wchar_t?在堆栈/堆上?null-terminated/fixed -width /两?)。

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = BLUETOOTH_MAX_NAME_SIZE)] 
public string szName; 

在这种情况下,会明确地告知szName当它被封送到非托管代码应(与大小= BLUETOOTH_MAX_NAME_SIZE)表示为BSTR的运行时间。要详细说明BSTR究竟是什么,请参阅:Eric's Complete Guide To BSTR Semantics

+0

如果我有这样的代码:const int BLUETOOTH_MAX_NAME_SIZE = 248; 变量szName发生了什么? –

+0

@EkaS什么都没有; 'sZName'仍然只是一个普通的'string',直到它必须被编组到本地代码中(如果你将'szName'传递给'DllImport''函数,会发生这种情况,在这种情况下,它会分配至少248个字节的非托管内存来适应该字符串的副本以用于非托管代码)。 –

+0

所以当应用程序执行此代码szName的将被编组 [的DllImport( “bthprops.cpl”,字符集= CharSet.Auto,SetLastError =真)] 静态外部的IntPtr BluetoothFindFirstDevice(参照BLUETOOTH_DEVICE_SEARCH_PARAMS SearchParams,参考BLUETOOTH_DEVICE_INFO DeviceInfo);] –

0

第一行是Guid的实例化。这是一个非常具体的Guid,其值传递给它作为相应的Guid值。

第二行是Attribute,用于指定将其应用于的变量如何在托管和非托管代码之间编组。如果术语“编组”对你来说是外来的。I suggest you read up on it了解更多。

第三行是具有上述属性的字符串变量应用于它。

+0

如果我有这个代码:const int BLUETOOTH_MAX_NAME_SIZE = 248;变量szName发生了什么? –