2012-12-25 40 views
0

我有一個包含返回結構和字節的功能的DLL,和7倍的陣列的陣列:進口C++ DLL,返回一個結構與雙打

public struct myStruct 
{ 
    public byte v1;  
public Blob v2; 
} 

的DLL功能:

[DllImport("myDLL", EntryPoint = "[email protected]@[email protected]@XZ", ExactSpelling = true)] 
public static extern MyStruct myDLLFunction(); 

這是我的blob:

[StructLayout(LayoutKind.Sequential, Size = ((sizeof(double))*7))] 
public struct Blob 
{ 
// Intentionally left empty. It's just a blob 
} 

我創建了一個函數來獲取數組:

public double[] GetArray(Blob NameBlob) 
{ 

    IntPtr dPtr = IntPtr.Zero; 
    try 
    { 
     dPtr = Marshal.AllocHGlobal(((sizeof(double))*7)); 
     Marshal.StructureToPtr(NameBlob, dPtr, false); 
     double[] r = new double[((sizeof(double))*7)]; 

     Marshal.Copy(dPtr, r, 0, ((sizeof(double))*7)); 

     return r; 
    } 
    finally 
    { 
     if (dPtr != IntPtr.Zero) 
     { 
      Marshal.FreeHGlobal(dPtr); 
     } 
    } 
} 

我把它叫做是這樣的:

myStruct s1=myDLLFunction(); 

GetArray(s1.v2)[0]; // print it 

我得到錯誤的值,請如果有人能幫助我,將是巨大的,我說明使用元帥......我想有是我做錯了的地方。

+0

PS:我不能改變Dll,它不是我的 – user1928596

+0

歡迎來到SO。只是你知道,你可以編輯你自己的帖子,所以你不必添加註釋=) –

+1

StructureToPtr()在結構沒有任何字段時不做任何事情。您需要聲明數組,使用MarshalAs將其聲明爲ByvalArray。 –

回答

1

正如Hans Passant所指出的,當結構沒有任何字段時,StructureToPtr()不會執行任何操作。我想我們在談論這個:

[StructLayout(LayoutKind.Sequential)] 
public struct Blob 
{ 
    [MarshalAs (UnmanagedType.ByValArray, SizeConst = 7)] 
    double[] array; 
}