2010-09-14 33 views

回答

9

Hardlinks.pasJCL

type 
    IO_STATUS_BLOCK = record 
    case integer of 
     0: 
     (Status: NTSTATUS); 
     1: 
     (Pointer: Pointer; 
     Information: ULONG); // 'Information' does not belong to the union! 
    end; 
    // PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK; 
+0

你能發表一個解釋嗎? – CyprUS 2012-04-17 13:20:11

+0

什麼不清楚? – 2012-04-17 14:11:47

+0

例如爲什麼信息內的信息stmt?此外,案件如何有案件整數condn?這種情況如何發揮作用? – CyprUS 2012-04-17 14:22:16

3

AC聯盟可以翻譯在記錄中有一個case選擇器,這裏的問題是Delphi不允許Case語句之後的任何內容。這可以用一個嵌套的Case語句來解決,就像這樣:

_IO_STATUS_BLOCK = record 
    case Integer of 
     0: (
     case Integer of 
     0: (
      Status: NTSTATUS); 
     1: (
      Pointer_: Pointer); 
     2: (Information: ULONG_PTR)); 
    end; 
    IO_STATUS_BLOCK = _IO_STATUS_BLOCK; 
    PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK; 

/編輯: 爲了使偏移正確的(見下面的註釋)需要填充,修正版本如下。這裏並不提供太多的優勢,但它會如果有更多的領域,甚至工會按照工會第一背後:

_IO_STATUS_BLOCK = record 
    case Integer of 
     0: (
     case Integer of 
      0: (Status: NTSTATUS); 
      1: (Pointer_: Pointer)); 
     1: (
     Pad: DWORD; 
     Information: ULONG_PTR); 
    end; 
    IO_STATUS_BLOCK = _IO_STATUS_BLOCK; 
    PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK; 

/EDIT2: 一個更好的版本是這樣的:

_IO_STATUS_BLOCK = record 
    case Integer of 
     0: (
     Status: NTSTATUS; 
     Pointer_: Pointer); 
     1: (
     case Padding: DWORD of 
      0: (
      Information: ULONG_PTR)); 
    end; 
    IO_STATUS_BLOCK = _IO_STATUS_BLOCK; 
    PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK; 
+0

在此記錄中,聯盟和「信息」應占據相同的空間,記錄大小應爲4而不是8.測試它,將所有內容設置爲「信息」並從「狀態」中讀取。 IOW它與3個表達式的case語句是一樣的,我認爲這就是編譯器抱怨'重複標籤值'的原因。 – 2010-09-14 09:53:06

+0

@Tondrej:我在編譯器中沒有測試的情況下輸入它,我得到了和你一樣的錯誤和相同的修復(編輯答案)。 – Remko 2010-09-14 09:53:34

+0

@塞塔克:我認爲你是對的。 – 2010-09-14 09:54:45

4

另外到其他帖子,您可能需要閱讀Pitfalls of Conversion。 Rudy的articles是關於Delphi/C/C++互操作性的信息的金礦。

+0

+1鏈接! Noroc,@MihaiLimbăşan! Bucuros decunoştinţă! – ALZ 2014-02-28 12:51:58