2009-10-16 28 views
8

Trong một số IDL tôi làm việc với tôi đã nhận thấy rằng có 2 quy ước để đánh dấu các giá trị trả về theo phương thức - [in, out][out, retval].Sự khác nhau giữa [in, out] và [out, retval] trong định nghĩa COM IDL

Dường như [in, out] được sử dụng khi có nhiều giá trị trả về, ví dụ:

HRESULT MyMethod(
    [in] long InputParam, 
    [in, out] long* OutputParam1, 
    [in, out] long* OutputParam2 
); 

Dường như [out, retval] được sử dụng khi chỉ có một giá trị trả về duy nhất, ví dụ:

HRESULT MyMethod2(
    [in] long InputParam, 
    [out, retval] long* OutputParam1 
); 

Đây có phải là quy ước COM IDL hay chỉ là quy ước trong mã tôi đang làm việc cùng?

Có sự khác biệt về chức năng trong mã sẽ được tạo từ 2 ký hiệu hoặc chúng có thể hoán đổi cho nhau hoàn toàn không?

Trả lời

23

[in, out] có nghĩa là giá trị hợp lệ được chuyển khi phương thức được gọi và giá trị hợp lệ ở đó (nơi con trỏ trỏ) khi phương thức trả về thành công. [out] có nghĩa là giá trị được trỏ đến có thể là bất cứ khi nào phương thức được gọi nhưng nó sẽ hợp lệ khi phương thức trả về thành công. Cả hai tham số [out][in, out] phải là con trỏ - giá trị của chúng không thay đổi và hợp lệ và các yêu cầu về tính hợp lệ chỉ áp dụng cho các biến mà chúng trỏ đến.

[out, retval] là một đường cú pháp để cho biết rằng khi tạo một trình bao bọc Hỗ trợ COM gốc, thông số này phải được chuyển thành giá trị trả lại. Ví dụ

HRESULT MyMethod([out] long* OutParam1, [out, retval] long* OutParam2); 

trở thành

long IWrappedInterface::MyMethod(long* OutParam1); 

Nếu bạn không đánh dấu nó [retval] các wrapper sẽ chứa một phương pháp với chữ ký gốc:

HRESULT IWrappedInterface::MyMethod(long* OutParam1, long* OutParam2); 

Chỉ có một [out] tham số cuối cùng có thể được đánh dấu là [out, retval]. Không thể đánh dấu các thông số [in, out][retval].

+0

Cảm ơn lời giải thích hữu ích. – LeopardSkinPillBoxHat

+0

Tôi muốn thêm rằng '[trong, ngoài]' có thể không được xử lý chính xác bởi tất cả các ngôn ngữ (cụ thể hơn, trường cũ Visual Basic, không chắc chắn về .NET). –

+0

Tôi tự hỏi nếu [ra, retval] là chống lại thực hành tốt nhất để xác định giao diện COM vì không có cách nào để có được mã lỗi (HRESULT) nếu thực hiện thất bại? – dave

0

Sự khác biệt là cách điều này sẽ hiển thị trong PIA trong mã .NET.

[out, ret] sẽ hiển thị dưới dạng giá trị trả về trong .NET.

[out] sẽ hiển thị một đối số về phương thức trong .NET.

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