`
yanzilee9292
  • 浏览: 541084 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

[ruby-core:35397] [Ruby 1.9 - Bug #4405] WIN32OLE & Threads incompatible

    博客分类:
  • ruby
 
阅读更多

简单的说, win32ole是线程不安全的, 如果在thread里面去调用它, 就会报错

 

 

Issue #4405 has been updated by Thomas Enebo.

英文部分来自: http://fossplanet.com/f14/%5Bruby-core-35397%5D-%5Bruby-1-9-bug-4405%5D-win32ole-threads-incompatible-109229/


JRuby's implementation should be prone to the same problems when accessing an STA service from multiple threads. The fact that it works should probably be considered luck more than anything. I agree with the original reporters statement that thread-safety is the users problem to work around.

One thing we could change in win32ole is the ability to specify that we want to access the service as MTA. This would allow MT programs to work at the extreme performance penalty that comes along with accessing a STA as MTA (100-1000x slower). It doesn't crash and for many COM services performance is not an issue.
__--------------------------------------
Bug #4405: WIN32OLE & Threads incompatible
http://redmine.ruby-lang.org/issues/4405

Author: Lars Christensen
Status: Open
Priority: Normal
Assignee: 
Category: ext
Target version: 
ruby -v: ruby 1.9.2p136 (2010-12-25) [i386-mingw32]


The WIN32OLE library does not work when using Ruby threads. It may raise exceptions such as this:

(druby://localhost:2002) threadsys.rb:7:in `connect': failed to parse display name of moniker `winmgmts://localhost/root/cimv2' (WIN32OLERuntimeError)

WIN32 OLE api's are not generally Thread safe, and it can be argued that it is the user's task to ensure that it is accessed only from one thread, or the main thread. However, there are some complications;

- Using WIN32OLE from DRb (DRb can not be used without Threads).
- Using WIN32OLE indirectly (e.g. through Sys::ProcTable).

My specific case was a DRb server that examined processes using Sys::ProcTable, which happen to use WIN32OLE. This causes an exception. Attached is a simple script that recreates the problem. Note that in this simple case, WIN32OLE is only invokes once, and only from one single thread (and it still throws the exception).

 

 

官方说这个bug已经修好了, 实际上还是存在, 这里给出一个暂时的解决方法:

 

 

require 'win32ole'

# Also possible using Daniel Berger's excellent windows-pr gem.
require 'Win32API'
CoInitialize = Win32API.new('ole32', 'CoInitialize', 'P', 'L')

threads = []
3.times do
  threads << Thread.new do
    begin
      CoInitialize.call( 0 )
      ie = WIN32OLE.new( "InternetExplorer.Application" )
      ie.visible = true
      ie.navigate( "http://google.com" )
      puts "OK"
    rescue Exception => e
      puts e.class
      puts e
      puts e.backtrace
    end
  end
end

threads.each {|t| t.join }
 

 

1
5
分享到:
评论
1 楼 yanzilee9292 2011-08-19  
解决方法二: 换一个ruby版本, 感觉上有一定的风险, 不过确实解决这个问题了

ruby 1.9.2dev (2010-01-02 trunk 26229) [i386-mingw32]

相关推荐

    win32ole_ruby

    Win32OLE extension library provides an interface to OLE Automation from Ruby. Here is a sample script: require 'win32ole' application = WIN32OLE.new('Excel.Application') application.visible = TRUE...

    Win32::OLE模块

    **Win32::OLE模块详解** Win32::OLE是Perl编程语言中一个非常重要的模块,主要用于与Windows操作系统上的对象链接和嵌入(OLE)组件进行交互。通过这个模块,Perl程序员可以方便地控制和自动化许多Windows应用程序,...

    Win32::OLE

    本文将深入探讨如何利用Perl中的Win32::OLE模块来实现这一目标,同时也将涵盖一些相关的知识点,以便读者能够更好地理解和应用这些技术。 ### Win32::OLE模块 Win32::OLE是Perl的一个强大模块,它允许Perl脚本通过...

    win32ole mapi开发

    在IT行业中,`Win32OLE`、`MAPI` 和 `Outlook` 是与Windows平台上电子邮件编程密切相关的技术。`Win32OLE`(Windows Interface for Object Linking and Embedding)是Microsoft提供的一种接口,允许Ruby等脚本语言与...

    Go-go-ole-golang的Win32OLE实现

    【标题】"Go-go-ole-golang的Win32OLE实现"主要涉及到的是在Go语言中如何使用`go-ole`库来实现Windows操作系统上的Win32对象链接与嵌入(OLE)技术。OLE是微软在Windows平台上实现的一个组件对象模型(COM),它允许...

    Edanmo&#039;s OLE interfaces &amp; functions v1.4

    《Edanmo的OLE接口与函数v1.4详解》 在信息技术领域,OLE(Object Linking and Embedding,对象链接与嵌入)是微软提出的一种技术,它允许不同的应用程序之间共享数据和功能。本文将深入探讨《Edanmo's OLE ...

    win32ole-mapi

    **win32ole-mapi 知识点详解** 在Windows操作系统环境下,开发人员常常需要与Microsoft Office应用程序,尤其是Outlook进行交互,以便实现自动化任务,如发送邮件、管理联系人等。win32ole和MAPI(Messaging ...

    Perl中使用Win32_OLE模块读写Excel的方法1

    【Perl中的Win32::OLE模块】 Perl是一种高级的、通用的、解释型的、动态的编程语言,最初由Larry Wall为Unix系统设计,旨在融合Unix shell的易用性和类似C语言的功能。Perl语言因其灵活性和高效性,在系统管理、Web...

    刷博客小程序 net/http URI win32ole操作ie

    标题 "刷博客小程序 net/http URI win32ole操作ie" 提及了几个关键的技术概念,主要包括网络编程中的URI(统一资源标识符)、HTTP协议以及Windows系统下的自动化工具win32ole用于操作Internet Explorer。让我们逐一...

    Jam.ShellBrowser.8.1.2.2013-03-06

    Bugfix - JamShellTree: Avoiding exceptions during Drag&Drop (Win XP). Several minor improvements and fixes have been incorporated. V8.1.1 Released on 11 Feb 2013 ShellBrowser V8.1.1 supports C++ ...

    win32::ole

    win32::ole的官方文档,放在这里给大家看看

    达内的课堂笔记

    - **简介**:基于OLE DB之上的一层封装,简化了数据访问操作,使得开发人员能够更容易地与不同类型的数据库进行交互。 - **关系**:ADO是建立在OLE DB基础上的一个更高层次的对象模型。 ### 使用ADO进行数据库操作 ...

    go-ole:Golang的Win32 ole实现

    去OLE 使用共享库而不是cgo为Windows COM进行绑定。 松本康弘。 安装 要试验go-ole,您可以编译并运行示例程序: go get github.com/go-ole/go-ole cd /path/to/go-ole/ go test cd /path/to/go-ole/example/...

    asp.net期末试题

    - D: OLE DB相关的命名空间。 - **知识点:**在ASP.NET中,要访问SQL Server数据库,需要使用`System.Data.SqlClient`命名空间下的`SqlConnection`等类。 **12. RangeValidator验证控件** - **选项分析:** - A...

    node-win32ole:node.js的异步,非阻塞win32ole绑定

    名称node-win32ole-由v8引擎提供动力的异步,非阻塞win32ole绑定。 win32ole使从node.js到Excel,Word,Access,Outlook,InternetExplorer,WSH(ActiveXObject / COM)等的可访问性成为可能。 它不需要TypeLibrary...

    \Program Files\Microsoft Platform SDK for Windows Server 2003 R2 LIB文件

    \Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib 的目录 2009-09-06 16:17 &lt;DIR&gt; . ...2006-03-03 23:23 73,704 Ole32.Lib 2006-03-03 23:23 5,178 OleAcc.Lib 2006-03-03 23:23 ...

    Edanmo&#039;s OLE interfaces &amp; functions v1.81

    这个是v1.81的下载地址,寻找起来非常不容易,可惜文档很少,宝剑在手苦于没有简谱,谁要是能有完整的说明...Edanmo's OLE interfaces & functions v1.4 下载地址为https://download.csdn.net/download/sysdzw/2652292

    VC++ SHU JU LEI XING

    本篇将深入解析VC++中常见的数据类型,包括基本类型、Win32 API数据类型以及转换方法。 一、VC++常用数据类型列表 1. 基础类型 - boolean: 8位无符号整型,表示逻辑值,通常用TRUE/FALSE表示。 - byte: 8位无...

    VC++ 实战OLEDB编程

    ### OLEDB实战编程知识点详解 #### 一、OLEDB简介 OLEDB(Object Linking and Embedding Database)是微软开发的一种数据访问技术,旨在为应用程序提供统一的接口以访问不同类型的数据库。作为Windows平台上非常...

    手把手教你如何在win7上装vc++6[1].0.pdf

    - C:\windows\system32\wbem - 包含文件(Include files): - D:\Program Files\Microsoft Visual Studio\VC98\INCLUDE - D:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE - D:\Program Files\...

Global site tag (gtag.js) - Google Analytics