Bug #16116
closedruby2.6.3(x86/x64) use win32ole could not new Object, return 0x80070057
Description
I build a RubyTest.dll by C#, In ruby2.2, I could use WIN32OLE.new to create ole object, but in the same system under ruby2.6.3, it failed to create ole object by WIN32OLE.new, is there any different between ruby 2.2 and ruby 2.6.3 in WIN32OLE?
OS: Win7 Profressional SP1 64bit
/////// Ruby 2.6.3 use WIN32OLE failed to load dll //////////
C:\Ruby26\bin>ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [i386-mingw32]
C:\Ruby26\bin>irb
irb(main):001:0> require 'win32ole'
=> true
irb(main):002:0> WIN32OLE.new('RubyTest.DllTest')
Traceback (most recent call last):
6: from C:/Ruby26/bin/irb.cmd:31:in <main>' 5: from C:/Ruby26/bin/irb.cmd:31:in
load'
4: from C:/Ruby26/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in <top (require 3: from (irb):2 2: from (irb):2:in
new'
1: from (irb):2:in initialize' WIN32OLERuntimeError (failed to create WIN32OLE object from
RubyTest.DllTest')
** HRESULT error code:0x80070057
The parameter is incorrect.**
irb(main):003:0>
c:\TestTools\impeller\lib\Ruby\bin>ruby -v
ruby 2.2.6p396 (2016-11-15 revision 56800) [i386-mingw32]
/////// Ruby 2.2 use WIN32OLE success load dll //////////
c:\TestTools\impeller\lib\Ruby\bin>irb
irb(main):001:0> require 'win32ole'
=> true
irb(main):002:0> WIN32OLE.new('RubyTest.DllTest')
@@@DllTest Constructor
=> #WIN32OLE:0x7418b68
irb(main):003:0>
Files
Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago
- Status changed from Open to Feedback
It's hard to debug issues like this without having a self contained reproducible example. Can you provide a self contained reproducible example showing the problem? Basic testing of WIN32OLE using Ruby 2.6 on Windows 10 with the examples in the documentation (which use Excel.Application
) work fine, so this doesn't appear to be a general problem with WIN32OLE.
Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago
- Status changed from Feedback to Closed
Updated by whdukewu (Kewu DU) over 4 years ago
finally we solve this problem by this way:
- add mscoree.dll to windows registry key ** \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** **
- restart windows systems
then we can load dll files in ruby 2.6.3.
The dll developed by C# language depend mscoree.dll, in ruby2.2, windows system can search the mscoree.dll successfully, but in ruby2.6, it fails to search mscoree.dll when call the WIN32OLE.new method, CoCreateInstance function in win32ole.c returns 0x80070057, this indicates some parameter is invalid, we don't know why this happen, even we set RUBY_DLL_PATH, it failed to load C# dll files.
Updated by larskanis (Lars Kanis) over 4 years ago
@whdukewu Can you provide a reproducible example of such a C# DLL? We got several issues with WIN32OLE at RubyInstaller, but I wasn't able to reproduce them - mostly because they depend on some proprietary COM DLLs. Your use case seems easy enough to be usable for investigation of the issue.
Updated by krolchatina (Dmitry Kirillov) almost 4 years ago
- File ClassLibraryForRuby.zip ClassLibraryForRuby.zip added
I have the same issue with Ruby 3.0.2 and .NET COM assemblies. The problem seems to be related to how the assembly is registered: If InprocServer32/Default contains the full path to mscoree.dll (C:\Windows\system32\mscoree.dll) there is no problem with WIN32OLE.new
If InprocServer32/Default contains only mscoree.dll (which seems to be the default nowadays), WIN32OLE.new fails with "HRESULT error code:0x80070057 / The parameter is incorrect."
I created a small assembly that demonstrates the problem. The assembly can be built using "dotnet build" command.