2009-05-06 74 views
9

Tôi đang cố chuyển cấu trúc từ thư viện C# vào C++. Tôi chuyển cấu trúc như một đối tượng, và hàm C++ mong đợi nó như một con trỏ (void *).Làm cách nào để tôi sắp xếp cấu trúc dưới dạng con trỏ tới cấu trúc?

Tôi gặp sự cố khi chuyển cấu trúc.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec); 

Dưới đây là ngoại lệ văn bản thời gian chạy tôi nhận được:

"Không thể marshal 'tham số # 1': không hợp lệ quản lý/kết hợp kiểu không được quản lý (loại giá trị này phải được ghép nối với Struct). "

Mặc dù tôi đã tìm thấy một bài viết MSDN sử dụng LPStruct trong chính xác ngữ cảnh này.

Đây là cấu trúc của tôi, tôi đang cố gắng để soái:

[StructLayout(LayoutKind.Sequential)] 
public struct UserRec { 
    [MarshalAs(UnmanagedType.I4)] 
    public int userParam1; 
} 

Đây là hàm C++:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {... 

Trả lời

17

Hãy thử qua cấu trúc như một tham số ref.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction(ref UserRec userRec); 

Khi bạn sử dụng kết hợp được kết hợp với cấu trúc, khái niệm này truyền địa chỉ.

+4

Bạn thậm chí không cần [MarshalAs] trong trường hợp này tôi nghĩ. –

+0

@Anton, bạn chính xác (cập nhật) – JaredPar

+0

Kết quả làm việc kết thúc: public static extern IntPtr TheFunction ([MarshalAs (UnmanagedType.Struct), In] ref UserRec userRec); Và [MurshalAs] ở đây chỉ để làm cho nó rõ ràng, nhưng không bắt buộc. –

13

Ngẫu nhiên, UnmanagedType.LPStruct hiếm khi, nếu có, đúng đối số MarshalAs. A quote from Adam Nathan người là một nhân viên của Microsoft:

UnmanagedType.LPStruct chỉ được hỗ trợ cho một trường hợp cụ thể: điều trị một loại giá trị System.Guid như một GUID không được quản lý với một cấp thêm về mình.

+0

Nhưng tôi muốn nó hoạt động cho PROPERTYKEY: '( – jnm2

+0

Btw, cảm ơn vì lý do tại sao điều này là như vậy. Đó là điều tôi thực sự muốn. – jnm2

+0

(Chờ đã, sự điên rồ này là gì? Tôi đã sử dụng 'ref' trong chữ ký nhưng không phải tại trang web cuộc gọi! Ngôn ngữ C# phải có ngoại lệ cho giao diện COM?) – jnm2

Các vấn đề liên quan