2008-12-12 20 views
11

Tôi đang triển khai giao diện COM sẽ trả về giá trị int là S_OK hoặc E_FAIL. Tôi ok trả lại S_OK khi tôi nhận lại điều đó từ một cuộc gọi khác (Marshal.QueryInterface), nhưng nếu tôi muốn trả lại giá trị thất bại, tôi sẽ sử dụng giá trị thực nào cho E_FAIL?Giá trị nào cần trả lại cho S_OK hoặc E_FAIL từ mã C# .net?

(Đó là một câu hỏi cơ bản cơ bản như vậy mà nó thật khó để tìm câu trả lời cho)

Giả sử nó là một con số cụ thể được định nghĩa trong Win32 API, là có cách để sử dụng nó trong mã .net mà không tuyên bố liên tục của riêng tôi ?

cảm ơn!

Cập nhật (trả lời dưới đây):

Có lẽ tôi là một plonker hoàn chỉnh, nhưng tôi đang gặp vấn đề với điều này. Theo SDK nền tảng của tôi, HRESULT là LONG, là số nguyên có ký hiệu 32 bit, phải không? Vì vậy, giá trị có thể là -247,483,648 đến 2,147,483,647. Nhưng 0x80004005 = 2.147.500.037 là> 2.147.483.647. Đưa cái gì!?

Điều này có nghĩa khi tôi cố gắng đặt điều này trong mã của tôi:

const int E_FAIL = 0x80004005; 

tôi nhận được một lỗi biên dịch có thể không mặc nhiên chuyển đổi loại 'uint' thành 'int'.

Cập nhật 2:

Tôi sẽ phải khai báo nó như thế này:

const int E_FAIL = -2147467259; 

vì nếu tôi cố gắng làm một cái gì đó như thế này:

const UInt32 E_FAIL = 0x80004005; 
return (Int32)E_FAIL; 

tôi nhận được một lỗi biên dịch Giá trị không đổi '2147500037' không thể được chuyển đổi sang 'int' (sử dụng cú pháp 'bỏ chọn' để ghi đè)

Phew! Ai biết nó sẽ phức tạp thế nào để khai báo một giá trị trả về chuẩn .... Một nơi nào đó phải có một lớp ẩn nấp mà tôi nên sử dụng như trả về Win32ReturnCodes.E _ FAIL; ... phào nhẹ

ULTIMATE SOLUTION:

bây giờ tôi làm điều này bằng nhận được (đồ sộ nhưng rất hữu ích) HRESULT enum từ pinvoke.net và thêm nó vào giải pháp của tôi. Sau đó sử dụng nó một cái gì đó như thế này:

return HRESULT.S_OK; 

Trả lời

8

E_FAIL là Hex 80004005 trong WinError.h

Bạn có thể xem toàn bộ WinError.h file here. Bạn không phải cài đặt C++ chỉ để xem các giá trị.

UPDATE:

Các phiên bản có chữ ký và unsigned của 0x80004005 chỉ là hai đại diện của mặt nạ chút tương tự.Nếu bạn gặp phải lỗi truyền thì hãy sử dụng giá trị đã ký âm. Khi được ký vào một Liên Hợp Quốc đã ký, nó sẽ là giá trị "chính xác". Tự mình thử nghiệm trong C#, nó sẽ hoạt động ví dụ:

Mã này

static void Main(string[] args) 
    { 
     UInt32 us = 0x80004005; 
     Int32 s = (Int32)us; 

     Console.WriteLine("Unsigned {0}", us); 
     Console.WriteLine("Signed {0}", s); 
     Console.WriteLine("Signed as unsigned {0}", (UInt32)s); 

     Console.ReadKey(); 
    } 

sẽ sản xuất sản lượng này

  • Unsigned 2147500037
  • Signed -2147467259
  • Signed như unsigned 2147500037

Vì vậy, nó là an toàn để sử dụng - 21474 67.259 cho giá trị của E_FAIL

+0

cảm ơn vì tất cả sự giúp đỡ! – Rory

+1

Liên kết đã chết, xem [Giá trị HRESULT phổ biến tại đây] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa378137 (v = vs.85) .aspx) – bland

+0

Tôi đã cập nhật liên kết cho 'winerror.h', có rất nhiều tài liệu tham khảo, chỉ trong trường hợp ngắt liên kết lại, tìm kiếm rất đơn giản sẽ nhận được nó (nếu bạn đã có trình biên dịch C++ trên máy của mình thì có thể là một WinError.h tập tin đó) –

7

Từ WinError.h cho Win32

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L) 

Để tìm câu trả lời như thế này, sử dụng tìm kiếm tập tin hình ảnh studio để tìm kiếm các tập tin tiêu đề trong VC Bao gồm thư mục của visual studio của bạn cài đặt thư mục .

C:\Program Files\Microsoft Visual Studio 9.0\VC\include 
-1

Bạn nên tải SDK nền tảng (link)

Tôi đã tìm kiếm thông qua các mã và tìm thấy những điều sau đây trong winerror.h

typedef long HRESULT; 

#ifdef RC_INVOKED 
#define _HRESULT_TYPEDEF_(_sc) _sc 
#else // RC_INVOKED 
#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc) 
#endif // RC_INVOKED 

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L) 
#define S_OK ((HRESULT)0x00000000L) 

Bạn nên trở lại E_FAIL thay vì giá trị. Đơn giản chỉ cần bao gồm winerror.h.

+0

Ông đã gắn thẻ bài viết của mình C#, do đó ông không thể bao gồm nó và cần phải xác định nó chính mình, do đó câu hỏi. Điều này là rất phổ biến trong COM và PInvoke'ing. –

1

Tôi đã sử dụng này:

const int EFail = int.MinValue + 0x00004005; 

thỏa hiệp giữa khả năng đọc (nếu bạn đang sử dụng để mã hex) và hạn chế C# 's.

4

Sử dụng từ khóa "không được chọn" để thực hiện việc này.

ví dụ:

const int E_FAIL = unchecked((int)0x80004005); 
2

VSConstants có thể làm bạn muốn, bạn muốn:

VSConstants.S_OK Dòng

HRESULT Generic để thành công.

Namespace: Microsoft.VisualStudio

hội: Microsoft.VisualStudio.Shell.10.0 (trong Microsoft.VisualStudio.Shell.10.0.dll)

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