我需要幫助這個C類聲明轉換爲德爾福:如何到C工會轉換結構裏面德爾福
typedef struct _IO_STATUS_BLOCK {
union {
NTSTATUS Status;
PVOID Pointer_;
} ;
ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
我需要幫助這個C類聲明轉換爲德爾福:如何到C工會轉換結構裏面德爾福
typedef struct _IO_STATUS_BLOCK {
union {
NTSTATUS Status;
PVOID Pointer_;
} ;
ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
從Hardlinks.pas
在JCL:
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;
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;
在此記錄中,聯盟和「信息」應占據相同的空間,記錄大小應爲4而不是8.測試它,將所有內容設置爲「信息」並從「狀態」中讀取。 IOW它與3個表達式的case語句是一樣的,我認爲這就是編譯器抱怨'重複標籤值'的原因。 – 2010-09-14 09:53:06
@Tondrej:我在編譯器中沒有測試的情況下輸入它,我得到了和你一樣的錯誤和相同的修復(編輯答案)。 – Remko 2010-09-14 09:53:34
@塞塔克:我認爲你是對的。 – 2010-09-14 09:54:45
另外到其他帖子,您可能需要閱讀Pitfalls of Conversion。 Rudy的articles是關於Delphi/C/C++互操作性的信息的金礦。
+1鏈接! Noroc,@MihaiLimbăşan! Bucuros decunoştinţă! – ALZ 2014-02-28 12:51:58
你能發表一個解釋嗎? – CyprUS 2012-04-17 13:20:11
什麼不清楚? – 2012-04-17 14:11:47
例如爲什麼信息內的信息stmt?此外,案件如何有案件整數condn?這種情況如何發揮作用? – CyprUS 2012-04-17 14:22:16