---
title: Chrome-eject がこの先生きのこるには
tags:  #javascript #chrome  
author: [はせがわようすけ](https://convert.docswell.com/user/hasegawa)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/8GEW8MKWJ2.jpg?width=480
description: カーネル/VM+K*BUG勉強会@関西 ごかいめ
published: October 19, 13
canonical: https://convert.docswell.com/s/hasegawa/56EJW5-2022-03-14-205343
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/8GEW8MKWJ2.jpg)

Chrome-eject が
この先生きのこるには


# Page. 2

![Page Image](https://bcdn.docswell.com/page/W47Z8QZ2E3.jpg)

Who am I ?
はせがわようすけ
• http://utf-8.jp/
• 顔文字でJavaScript書いたり
• 顔文字で86バイナリ書いたり
@hasegawayosuke http://utf-8.jp/


# Page. 3

![Page Image](https://bcdn.docswell.com/page/KYJ6P6867V.jpg)

Chrome-eject ?
@hasegawayosuke http://utf-8.jp/


# Page. 4

![Page Image](https://bcdn.docswell.com/page/5GJ5K695E4.jpg)

Chrome-eject ?
@hasegawayosuke http://utf-8.jp/


# Page. 5

![Page Image](https://bcdn.docswell.com/page/4LE3ZQY5E5.jpg)

Chrome-eject uses NPAPI
NPAPI plugin
• Netscape Plugin API
• DLL形式でブラウザの機能を拡張
• Flash Player, Silverlight, ...
• http://www.slideshare.net/TNaruto/npapi-26722229
NPAPI plugin in Chrome Extension
• JavaScriptだけで出来ないことを実現
• Chrome拡張の制約を超えて何でも可能
• でもDLL書かないと…
@hasegawayosuke http://utf-8.jp/


# Page. 6

![Page Image](https://bcdn.docswell.com/page/V8EDR95YJG.jpg)

NPWIN32
• 何度もDLL書くのイヤだ
• 何でもできるNPAPI DLLを書いた
• JSから任意のWin32APIを呼び出せる
• PerlのWin32::APIみたいなもの
@hasegawayosuke http://utf-8.jp/


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4V7PWZG2J8.jpg)

Chrome-eject uses NPAPI
// manifest.json
&quot;plugins&quot; : [ { &quot;path&quot; : &quot;win32api.dll&quot;, &quot;public&quot; : false } ]
// background.html
&lt;embed type=&quot;application/x-win32api-dynamic-call&quot; id=&quot;p&quot; hidden=&quot;true&quot; /&gt;
var npwin32;
var mciSendString;
document.addEventListener( &quot;DOMContentLoaded&quot;, function (){
chrome.browserAction.onClicked.addListener( function( tab ){
if( npwin32 === undefined ){
npwin32 = document.getElementById( &quot;p&quot; );
}
if( mciSendString === undefined ){
mciSendString = npwin32.import( &quot;winmm.dll&quot;,
&quot;DWORD mciSendStringW( LPCWSTR, DWORD, UINT, DWORD )&quot;
);
}
if( mciSendString){
var r = mciSendString( &quot;set cdaudio door open&quot;, 0, 0, 0 );
}
} );
} );
@hasegawayosuke http://utf-8.jp/


# Page. 8

![Page Image](https://bcdn.docswell.com/page/L2JV8W6XJQ.jpg)

NPWIN32 - callback
// import DLL functions
var EnumWindows = npwin32.import(
&quot;user32.dll&quot;, &quot;BOOL EnumWindows( CALLBACK, DWORD )&quot; );
var GetWindowText = npwin32.import(
&quot;user32.dll&quot;, &quot;INT GetWindowTextW( DWORD, LPWSTR, INT )&quot; );
// create CALLBACK object
var func = npwin32.callback(
function ( hwnd, lparam ){
var buf = new Array( 257 ).join( &quot; &quot; ); // space * 256
if( GetWindowText( hwnd, buf, 256 ) ){
alert( hwnd + &quot; : &quot; + GetwindowText.arg( 1 ) );
}
},
&quot;BOOL (DWORD, DWORD)&quot;
);
EnumWindows( func, 0 );
@hasegawayosuke http://utf-8.jp/


# Page. 9

![Page Image](https://bcdn.docswell.com/page/Z5EG5DNREL.jpg)

“Goodbye to Our Friend NPAPI”
@hasegawayosuke http://utf-8.jp/


# Page. 10

![Page Image](https://bcdn.docswell.com/page/V4JQZ1QYJP.jpg)

NPAPI
plugins
N
P
A
P
I
告
別
式


# Page. 11

![Page Image](https://bcdn.docswell.com/page/DK743RNZE1.jpg)

How do I eject without NPAPI?
Native Messaging API
@hasegawayosuke http://utf-8.jp/


# Page. 12

![Page Image](https://bcdn.docswell.com/page/PLJ11Q5DJG.jpg)

How do I eject without NPAPI?
Native Messaging API
• http://developer.chrome.com/extensions
/messaging.html#native-messaging
• Chrome拡張と実行ファイル間でstdioを通じ
て通信できる
• 事前にmanifestファイルをレジストリに登録
する必要がある
• しかもHKLM!
(☝ ՞ਊ ՞)☝気軽にejectできない!
@hasegawayosuke http://utf-8.jp/


# Page. 13

![Page Image](https://bcdn.docswell.com/page/8GJW8M5872.jpg)

おっ?
なんかAPI追加されてる!?


# Page. 14

![Page Image](https://bcdn.docswell.com/page/W4EZ8QN9J3.jpg)

How do I eject without NPAPI?
ｷﾀ━━━━(ﾟ∀ﾟ)━━━━ !!!!!
@hasegawayosuke http://utf-8.jp/


# Page. 15

![Page Image](https://bcdn.docswell.com/page/KY76P68DEV.jpg)

chrome.system.storage
• ストレージデバイスの情報を取得
chrome.system.storage.getInfo(
function( devices ){
console.log( devices );
}
);
DVD-ROMデバイス
え？ fixed?
@hasegawayosuke http://utf-8.jp/


# Page. 16

![Page Image](https://bcdn.docswell.com/page/5G75K698J4.jpg)

chrome.system.storage
• とりあえずejectしてみる
chrome.system.storage.getInfo(
function( devices ){
devices.forEach( function( device ){
if( device.capacity == 0 ){
chrome.system.storage.ejectDevice(
device.id,
function ( result ){
console.log( result );
}
);
}
} );
}
result === &quot;failure&quot;
);
@hasegawayosuke http://utf-8.jp/


# Page. 17

![Page Image](https://bcdn.docswell.com/page/V9J2WM2VER.jpg)

chrome.system.storage
• Chrome 30+ で使える(はず)
• CD-ROMドライブでも ”removable” ではな
く “fixed” が返ってくる
• ejectDevice 失敗する
(☝ ՞ਊ ՞)☝やっぱりejectできない!
@hasegawayosuke http://utf-8.jp/


# Page. 18

![Page Image](https://bcdn.docswell.com/page/5DEYLXYQJM.jpg)

なんとか eject したい!
拡張に実行ファイル入れておいて、
ダウンロードさせてそれを実行だ!


# Page. 19

![Page Image](https://bcdn.docswell.com/page/2VJN41P2E8.jpg)

How do I eject ?
• 拡張のなかにejectするWSHファイル(*.vbs)
を含めておく
• chrome.downloads.download APIを使っ
てvbsをローカルにダウンロードさせる
• chrome.downloads.open APIを使ってダ
ウンロードしたvbsファイルを実行する
• うまくいけば eject 完了!
@hasegawayosuke http://utf-8.jp/


# Page. 20

![Page Image](https://bcdn.docswell.com/page/GYE9Q53DE3.jpg)

chrome.downloads
@hasegawayosuke http://utf-8.jp/


# Page. 21

![Page Image](https://bcdn.docswell.com/page/5GE8GYM5ED.jpg)

chrome.downloads
var url = chrome.extension.getURL( &quot;eject.vbs&quot; );
chrome.downloads.download( {
url : url,
filename : &quot;./&quot; +
url.replace( /^chrome-extension:\/\//, &quot;&quot; ),
conflictAction : &quot;overwrite&quot;
}, function( id ){
if( id === undefined ) return;
setTimeout( function(){
chrome.downloads.open( id );
chrome.downloads.erase( { id : id } );
}, 2000 );
} );
いまいち動きがおかしい。donloadのcallbackが呼ばれてすぐだと
ファイルを開けないので2秒待ちを入れている
@hasegawayosuke http://utf-8.jp/


# Page. 22

![Page Image](https://bcdn.docswell.com/page/MLELG4337R.jpg)

eject.vbs
Dim
Dim
Dim
Set
Set
wmp
drives
i
wmp = CreateObject( &quot;WMPlayer.OCX&quot; )
drives = wmp.cdromCollection
For i = 0 To drives.Count - 1
drives.Item( i ).Eject
Next
@hasegawayosuke http://utf-8.jp/


# Page. 23

![Page Image](https://bcdn.docswell.com/page/54JMQKDMEW.jpg)

DEMO


# Page. 24

![Page Image](https://bcdn.docswell.com/page/ZPJR8X4LE9.jpg)

Conclusion - how to eject from Chrome Extension
• NPAPIは今後使えない
• Native MessagingはNPAPIほど気軽には使
いにくい
• chrome.system.storageはいまいちおかし
い
• chrome.downloadsはZoneIdつけてくれる
• もう少し待てばもっとejectしやすくなるはず!
(☝ ՞ਊ ՞)☝ウイーン
Special Thanks to @Akkiesoft and Eject-command Users Group
@hasegawayosuke http://utf-8.jp/


