मैं सी # में वीएचडी एपीआई का उपयोग करके कुछ vhd/vhdx फ़ाइलों को बनाने की कोशिश कर रहा हूं।सी ++ संघ में सी # - अजीब व्यवहार
typedef struct _CREATE_VIRTUAL_DISK_PARAMETERS
{
CREATE_VIRTUAL_DISK_VERSION Version;
union
{
struct
{
GUID UniqueId;
ULONGLONG MaximumSize;
ULONG BlockSizeInBytes;
ULONG SectorSizeInBytes;
PCWSTR ParentPath;
PCWSTR SourcePath;
} Version1;
struct
{
GUID UniqueId;
ULONGLONG MaximumSize;
ULONG BlockSizeInBytes;
ULONG SectorSizeInBytes;
ULONG PhysicalSectorSizeInBytes;
PCWSTR ParentPath;
PCWSTR SourcePath;
OPEN_VIRTUAL_DISK_FLAG OpenFlags;
VIRTUAL_STORAGE_TYPE ParentVirtualStorageType;
VIRTUAL_STORAGE_TYPE SourceVirtualStorageType;
GUID ResiliencyGuid;
} Version2;
struct
{
GUID UniqueId;
ULONGLONG MaximumSize;
ULONG BlockSizeInBytes;
ULONG SectorSizeInBytes;
ULONG PhysicalSectorSizeInBytes;
PCWSTR ParentPath;
PCWSTR SourcePath;
OPEN_VIRTUAL_DISK_FLAG OpenFlags;
VIRTUAL_STORAGE_TYPE ParentVirtualStorageType;
VIRTUAL_STORAGE_TYPE SourceVirtualStorageType;
GUID ResiliencyGuid;
PCWSTR SourceLimitPath;
VIRTUAL_STORAGE_TYPE BackingStorageType;
} Version3;
};
} CREATE_VIRTUAL_DISK_PARAMETERS, *PCREATE_VIRTUAL_DISK_PARAMETERS;
मैं सी # करने के लिए कि कन्वर्ट करने के लिए कोशिश कर रहा हूँ, लेकिन बहुत किस्मत नहीं होने:
एक सी ++ संघ, जो ऐसा दिखता नहीं है। मुझे संस्करण 3 में बिल्कुल दिलचस्पी नहीं है, इसलिए मैं इसे छोड़ रहा हूं।
मैंने कई चीजों की कोशिश की है और सबसे अच्छा मैं वर्जन 2 काम कर रहा था (वास्तव में कुछ विचित्र कर रहा था), लेकिन मैंने कभी भी संस्करण 1 और संस्करण 2 को एक ही समय में काम नहीं किया है।
समाधान wielded है कि सबसे अच्छा परिणाम अब तक इस किया गया है, लेकिन वहाँ कुछ गड़बड़ है क्योंकि version1 बस काम नहीं करता हो गया है, और version1 में SectorSizeInBytes
एक ulong
बजाय uint
है (अगर मैं इसे करने के लिए बदल uint
की तरह यह होना चाहिए, मैं तोड़ Version2 और version1 अभी भी काम नहीं करता है!)
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
public struct CreateVirtualDiskParameters
{
[FieldOffset(0)] public CreateVirtualDiskParametersVersion1 Version1;
[FieldOffset(0)] public CreateVirtualDiskParametersVersion2 Version2;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CreateVirtualDiskParametersVersion1
{
public CreateVirtualDiskVersion Version;
public Guid UniqueId;
public ulong MaximumSize;
public uint BlockSizeInBytes;
public ulong SectorSizeInBytes;
public string ParentPath;
public string SourcePath;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CreateVirtualDiskParametersVersion2
{
public CreateVirtualDiskVersion Version;
public Guid UniqueId;
public ulong MaximumSize;
public uint BlockSizeInBytes;
public uint SectorSizeInBytes;
public uint PhysicalSectorSizeInBytes;
public string ParentPath;
public string SourcePath;
public OpenVirtualDiskFlags OpenFlags;
public VirtualStorageType ParentVirtualStorageType;
public VirtualStorageType SourceVirtualStorageType;
public Guid ResiliencyGuid;
}
मैं जानता हूँ कि सैद्धांतिक रूप से Version
क्षेत्र संस्करण structs के बाहर स्थापित किया जाना चाहिए और मुझे लगता है कि कोशिश की है और साथ ही, लेकिन यह सिर्फ टूट जाता है चीजें और भी मजेदार पर्याप्त ...
तो, क्या कोई सलाह दे सकता है कि ऊपर से सी # का उचित अनुवाद कैसे करें, संस्करण 3 संरचना को छोड़कर इसकी आवश्यकता नहीं है?
'उलझन (64 बिट)' और 'उल (32 बिट)' दोनों को 'उलंग (64 बिट)' के रूप में मैप किया जाना प्रतीत होता है। – AlexD
क्या आपने अपने सी ++ structs के सदस्यों के ऑफसेट को प्रिंट करने का प्रयास किया है? –
@TheodorosChatzigiannakis बिल्कुल यकीन नहीं है कि मैं इस बात को ध्यान में रखकर कैसे करूं जिसमें इसमें enums/structs और तार शामिल हैं। मेरा मतलब है, वे किस आकार का होगा? मैं इसे आजमाने के लिए खुला हूं, मुझे बताएं कि किस मूल्य का उपयोग करना है और मैं इसे एक शॉट दूंगा। – cogumel0