From: Andreas Lundgren Date: 2012-10-26T17:46:11+09:00 Subject: Creating a pointer to SAFEARRAY(BSTR) for COM object communication Hi! I have a hardware driver in DLL format that I would like to invoke from a Ruby script using the win32ole gem. One of the inputs is defined as a "SAFEARRAY(BSTR)*" is it possible to create such a pointer in Ruby? A BSTR type is defined on MSDN. Four byte header with length, then data and then two null characters as a terminator. ===== WORKING ===== When I call another method defined like this: HRESULT ICdfGetHandlerByName::GetHandlerByName([in] BSTR HandlerName, [out, retval] IUnknown ** ppUnk) I use this Ruby call: light_i = my_handler_interface.GetHandlerByName("CdfLight") Ruby solves this, I do not assemble the BSTR by hand, not introducing the header, terminator or anything, not doing anything to get the output from the double pointer to the result variable. Ot works! ===== NOT WORKING ===== This method however, I just cannot solve how to call: HRESULT ICdfHandleManager::ListHandleTypes([in, out] long * Count, [in, out, size_is(*Count)] SAFEARRAY(BSTR)* HandleTypes ) Anyone have any idéa how to create a pointer ro a SAFEARRAY(BSTR)? I constantly get "Type mismatch." and I have tried dussens of different syntax. straight_ruby_ldh_api.rb:30:in `method_missing': ListHandleTypes(WIN32OLERuntimeError) OLE error code:0 in HRESULT error code:0x80020005 Type mismatch. from straight_ruby_ldh_api.rb:30 (I also tried to assemble the BSTR myself although the calls with straigh usage of BSTR don't require me to take any action. length = 512 data = "x"*(length+4+2) #Header length_hs = length.to_s(16) if (4 < length_hs.length) raise "To Large Data" end for i in (0..3) do data[i+4-length_hs.length] = length_hs[(i)..(i)].to_i end In Python it is very smooth to use this DLL, works of the shelf. I really need to solve this in order for us to keep Ruby! :-/ -- Posted via http://www.ruby-forum.com/.