2010-02-17 31 views
11

Tôi duy trì một chương trình có thể được tự động thông qua COM. Nói chung khách hàng sử dụng VBS để làm kịch bản của họ, nhưng chúng tôi có một vài khách hàng sử dụng hỗ trợ ActiveX của Matlab và đang gặp sự cố gọi phương thức đối tượng COM với thông số NULL.Tương đương Matlab của NULL là gì khi nó gọi các phương thức COM/ActiveX?

Họ đã hỏi làm thế nào họ làm điều này trong Matlab - và tôi đã cọ rửa Mathworks' COM/ActiveX documentation trong một ngày hoặc lâu hơn và không thể tìm ra.

mã ví dụ họ có thể trông giống như thế này:

function do_something() 
    OurAppInstance = actxserver('Foo.Application'); 
    OurAppInstance.Method('Hello', NULL) 
end 

nơi NULL là nơi bằng ngôn ngữ khác, chúng tôi muốn viết NULL hoặc nil hoặc Nothing, hoặc, tất nhiên, vượt qua trong một đối tượng. Vấn đề là điều này là tùy chọn (và chúng được thực hiện như là tham số tùy chọn trong hầu hết, nhưng không phải tất cả, trường hợp) - những phương pháp này mong đợi để có được NULL khá thường xuyên.

Họ nói với tôi rằng họ đã cố gắng [] (mà từ đọc sách của tôi dường như có khả năng nhất) cũng như '', Nothing, 'Nothing', None, Null, và 0. Tôi không biết có bao nhiêu trong số đó là những từ khóa Matlab hợp lệ - chắc chắn không có tác dụng nào trong trường hợp này.

Có ai giúp được không? Matlab của cú pháp cho một con trỏ null/đối tượng để sử dụng như là một tham số phương pháp COM là gì?

Cập nhật: Cảm ơn tất cả các thư trả lời từ trước tới nay! Thật không may, không ai trong số các câu trả lời dường như làm việc, thậm chí không libpointer. Lỗi này là như nhau trong mọi trường hợp:

Error: Type mismatch, argument 2

tham số trong các thư viện kiểu COM này được mô tả trong RIDL như:

HRESULT _stdcall OurMethod([in] BSTR strParamOne, [in, optional] OurCoClass* oParamTwo, [out, retval] VARIANT_BOOL* bResult); 

các coclass trong câu hỏi thực hiện một giao diện duy nhất giảm dần từ IDispatch.

Trả lời

6

Tôi đang trả lời câu hỏi của riêng mình ở đây, sau khi nói chuyện với hỗ trợ kỹ thuật Matlab: Không có tương đương Nothing và Matlab không hỗ trợ điều này.

Cụ thể: Matlab không hỗ trợ đối số tùy chọn, nhưng không hỗ trợ đi trong biến con trỏ NULL (trên thực tế, để làm theo chính xác có bao Nothing công trình VB, một biến thể VT_EMPTY, tôi nghĩ) cho dù là một cuộc tranh cãi không bắt buộc hay không. Có tài liệu về một số loại null/pointerish, rất nhiều trong số đó được đề cập trong câu hỏi của tôi hoặc trong các câu trả lời khác nhau, nhưng chúng dường như không thể sử dụng được với sự hỗ trợ COM của chúng.

Tôi đã nhận được một cách giải quyết bằng cách hỗ trợ Matlab bằng cách sử dụng một DLL COM họ tạo ra và Excel để tạo ra một đối tượng không có gì dummy có thể được thông qua xung quanh trong kịch bản. Tôi đã không quản lý để có được workaround/hack làm việc, và thậm chí nếu tôi đã tiếc là tôi có lẽ không thể phân phối lại nó. Tuy nhiên, nếu bạn gặp phải cùng một vấn đề, mô tả này có thể cung cấp cho bạn một điểm khởi đầu ít nhất!

Sửa

Có thể this Old New Thing blog postthể thể liên quan. (Tôi không còn làm việc với quyền truy cập vào mã nguồn có vấn đề, hoặc truy cập vào Matlab, để làm mới bộ nhớ của tôi hoặc để kiểm tra.)

Tóm lại, cho IUnknown (hoặc có nguồn gốc) các thông số, bạn cần có một thuộc tính [unique] cho họ một cách hợp pháp là NULL. Tuyên bố trên yêu cầu Matlab tạo hoặc vượt qua một biến thể VT_EMPTY, mà nó không thể làm được. Có lẽ việc thêm [unique] có thể đã nhắc nhở động cơ Matlab truyền vào một con trỏ NULL (hoặc biến thể có chứa con trỏ NULL), thay vào đó - giả sử nó có thể làm điều đó, đó là phỏng đoán.

Đây là tất cả suy đoán từ mã này và sự phức tạp của nó là vài năm sau tôi vào thời điểm này. Tuy nhiên, tôi hy vọng nó sẽ giúp mọi người đọc trong tương lai.

3

Từ mathworks documentation, bạn có thể sử dụng chức năng libpointer:

p = libpointer; 

và sau đó p sẽ là một con trỏ NULL. Xem trang đó để biết thêm chi tiết.

Xem thêm: more information about libpointer.

+0

Cảm ơn Peter. Khách hàng được đề cập nói rằng anh ta đã thử điều này và nó không hoạt động. Tôi đã cập nhật câu hỏi với nhiều thông tin hơn về thông tin lỗi và chữ ký phương thức cụ thể. –

5

Câu trả lời của Peter sẽ hoạt động, nhưng điều bạn có thể muốn thử là NaN, đó là những gì Matlab sử dụng ususally làm giá trị NULL.

1

Ngoài việc sử dụng [] và libpointer (như đề xuất của Peter), bạn cũng có thể thử {}.

1

Câu trả lời đúng cho điều gì đó trong VB đang chờ đối số Nothing, bằng cách nào đó nhận được một COM/ActiveX Variant có loại biến thể VT_EMPTY.(Xem MSDN docs mà tham khảo hành vi marshaling cho Visual Basic Nothing)

MATLAB thể làm điều này với mảng rỗng ([]), nhưng tôi không chắc chắn .... vì vậy nó có thể không thực hiện được hoàn toàn trong MATLAB. Mặc dù ai đó có thể dễ dàng viết một thư viện COM nhỏ có mục đích là tạo một Biến thể với VT_EMPTY.

Nhưng nếu đối số có thuộc tính [optional] và bạn muốn để trống đối số tùy chọn đó, bạn nên không làm điều này. Xem số COM/ActiveX docs on Variants có nội dung theo VT_EMPTY:

VT_EMPTY: Không có giá trị nào được chỉ định. Nếu một đối số tùy chọn cho một phương thức Tự động hóa được để trống, không vượt qua một biến thể loại VT_EMPTY. Thay vào đó, hãy chuyển VARIANT loại VT_ERROR với giá trị DISP_E_PARAMNOTFOUND.

Matlab nên (nhưng có lẽ không) cung cấp phương pháp để tạo ra các đối tượng này (gọi là "không có gì" và "tùy chọn blank") để bạn có thể giao tiếp một cách chính xác với các đối tượng COM.

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