2009-02-06 26 views
8

Với tuyên bố C API này, nó sẽ được nhập vào C# như thế nào?Làm thế nào để nhập khẩu void * C API vào C#?

int _stdcall z4ctyget(CITY_REC *, void *); 

tôi đã có thể để có được điều này cho đến nay:

[DllImport(@"zip4_w32.dll", 
     CallingConvention = CallingConvention.StdCall, 
     EntryPoint = "z4ctygetSTD", 
     ExactSpelling = false)] 
    private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr); 

Đương nhiên trong C# là "void *" không biên dịch.

Một số Googling cho biết rằng nó phải được dịch là "đối tượng". Có vẻ như nó sẽ hoạt động. Nhưng những người khác chỉ ra rằng "Void * được gọi là một con trỏ hàm trong các thuật ngữ C/C++ trong thuật ngữ C# là một đại biểu". Điều đó không có ý nghĩa gì cả ở đây vì nó sẽ đại diện cho điều gì? Một số cuộc gọi tương tự cho các API khác được tìm thấy thông qua Googling sử dụng các chức năng khác trong API tương ứng. Nhưng trong API này, không có cuộc gọi nào khác có ý nghĩa.

Các tài liệu cho các cuộc gọi cho thấy một ví dụ:

z4ctyget(&city, “00000”); 

Mà dường như để chứng minh rằng ngay cả một giá trị tĩnh có thể được thông qua.

Nó sẽ biên dịch với đối tượng thay cho khoảng trống *. Tôi không biết liệu điều này có đúng hay không và tôi chưa có cơ hội thử nghiệm nó (vấn đề cấp phép).

+0

Tôi đoán là IntPtr –

+0

Bạn định làm gì với con trỏ khi bạn đã có nó? Tôi cho rằng tất cả những gì bạn cần là cấu trúc CITY_REC, và bạn có ý định bỏ qua 'ptr'? –

+0

@Erik - Vâng, tôi không chắc chắn. Các tài liệu có sẵn không rõ ràng về mục đích của param. –

Trả lời

13

Đối với void * tham số bạn chỉ có thể sử dụng một IntPtr

[DllImport(@"zip4_w32.dll", 
     CallingConvention = CallingConvention.StdCall, 
     EntryPoint = "z4ctygetSTD", 
     ExactSpelling = false)] 
    private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr); 
+0

Darn bạn Jared, 30 giây! Darn bạn thẳng đến heck! - = P –

+0

@Erick :) Đã có ít chiến thắng rút ngắn ngay hôm nay – JaredPar

1

Bạn cũng có thể sử dụng void * nếu bạn đánh dấu lớp học của bạn là không an toàn.

Nó thực sự phụ thuộc vào những gì API đang tìm kiếm trong thông số đó.

Bạn có thể thêm IntPtr hoặc Object * để có được trình biên dịch trong quá khứ, nhưng bạn vẫn sẽ cần truyền nó đúng dữ liệu khi bạn gọi nó.

0

Theo như tôi có thể nói với tờ khai C z4ctyget là:

int z4ctyget(CITY_REC *cityrec, char *zipcode); 

Tham số thứ hai là một chuỗi ANSI 5 nhân vật đại diện cho các mã zip mà bạn muốn để bắt đầu tìm kiếm của bạn hoặc "00000" để bắt đầu ở đầu tệp. Vì vậy, tuyên bố của bạn nên là:

[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)] 
private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode); 
+0

Tuyên bố C tôi đã hiển thị đã được kéo thẳng từ tệp .h do USPS cung cấp. –

+0

Tài liệu từ năm 2007 cho thấy tờ khai của tôi. Trong mọi trường hợp, ví dụ "00000" chỉ ra rằng đầu vào được mong đợi là một chuỗi (gần như chắc chắn là ANSI). Vì vậy, tuyên bố C# của tôi nên là những gì bạn đang tìm kiếm. –

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