2014-02-20 45 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發生了什麼? –