C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

Shell関数の使い方 /ごじら (17/04/18(Tue) 10:13) #83867
Re[1]: Shell関数の使い方 /Hongliang (17/04/18(Tue) 10:48) #83869
  └ Re[2]: Shell関数の使い方 /ごじら (17/04/18(Tue) 10:52) #83870
    └ Re[3]: Shell関数の使い方 /Hongliang (17/04/18(Tue) 11:00) #83871
      └ Re[4]: Shell関数の使い方 /ごじら (17/04/18(Tue) 12:41) #83874
        └ Re[5]: Shell関数の使い方 /魔界の仮面弁士 (17/04/18(Tue) 13:16) #83875
          └ Re[6]: Shell関数の使い方 /ごじら (17/04/18(Tue) 15:17) #83878
            └ Re[7]: Shell関数の使い方 /Hongliang (17/04/18(Tue) 17:06) #83879
              └ Re[8]: Shell関数の使い方 /ごじら (17/04/18(Tue) 21:22) #83880
                ├ Re[9]: Shell関数の使い方 /PANG2 (17/04/18(Tue) 23:01) #83881
                └ Re[9]: Shell関数の使い方 /Azulean (17/04/19(Wed) 06:28) #83882


親記事 / ▼[ 83869 ]
■83867 / 親階層)  Shell関数の使い方
□投稿者/ ごじら (1回)-(2017/04/18(Tue) 10:13:42)

分類:[.NET 全般] 

2017/04/18(Tue) 10:53:06 編集(投稿者)

MP3ファイルからタグ情報を抽出したいのですが
http://www.atmarkit.co.jp/fdotnet/dotnettips/591mp3tags/mp3tags.html

このページにあるように
「Microsoft Shell Controls And Automation」を参照設定した上で

Dim shell As New ShellClass()

としてみたのですが
クラス 'ShellClass' への参照は、そのアセンブリが相互運用機能型を埋め込むように構成されている場合には許可されません。

というエラーが出てしまいます


Dim shell As New Shell()
とすると実行する時に
型 'System.InvalidCastException' のハンドルされていない例外が xxxxプログラム.exe で発生しました

追加情報:型 'System.__ComObject' の COM オブジェクトをインターフェイス型 'Shell32.Shell' にキャストできません。IID '{286E6F1B-7113-4355-9562-96B7E9D64C54}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外:0x80004002 (E_NOINTERFACE))。

というエラーが出てしまいます。

一体どのようにすれば良いですか?




[ □ Tree ] 返信 編集キー/

▲[ 83867 ] / ▼[ 83870 ]
■83869 / 1階層)  Re[1]: Shell関数の使い方
□投稿者/ Hongliang (526回)-(2017/04/18(Tue) 10:48:32)
http://so-zou.jp/software/tech/programming/c-sharp/file/property.htm
STAなスレッド以外で呼び出した場合にE_NOINTERFACEになるケースがあるようです。
アプリケーションの種類は何でしょうか? WinForm?
それをメインスレッド以外で動かそうとしていますか? であればどのようにそのスレッドを動かしていますか? Thread? BackgroundWorker? Task?
[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83869 ] / ▼[ 83871 ]
■83870 / 2階層)  Re[2]: Shell関数の使い方
□投稿者/ ごじら (2回)-(2017/04/18(Tue) 10:52:48)
Threadで動かしています

マルチスレッドだと普通に使えないのでしょうか?
 
[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83870 ] / ▼[ 83874 ]
■83871 / 3階層)  Re[3]: Shell関数の使い方
□投稿者/ Hongliang (527回)-(2017/04/18(Tue) 11:00:45)
2017/04/18(Tue) 11:01:38 編集(投稿者)

Threadであれば、.Start()する前に、.SetApartmentState()でSTAをしてみてください。
[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83871 ] / ▼[ 83875 ]
■83874 / 4階層)  Re[4]: Shell関数の使い方
□投稿者/ ごじら (3回)-(2017/04/18(Tue) 12:41:08)


ありがとうございます。

まだ、試していませんが原因を理解できたので恐らくうまくいくと思います

ところで、
シングルスレッドアパートメント(Single Thread Apartment)
という言葉を初めて知ったので
調べてみたのですが
http://zecl.hatenablog.com/entry/20070708/p1
COMオブジェクトにアクセスする際に
同時に複数のスレッドからアクセスしないようにする設定であることが理解できたのですが
COMオブジェクト以外もこの設定の影響を受けるのでしょうか?


[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83874 ] / ▼[ 83878 ]
■83875 / 5階層)  Re[5]: Shell関数の使い方
□投稿者/ 魔界の仮面弁士 (1263回)-(2017/04/18(Tue) 13:16:13)
2017/04/18(Tue) 13:17:13 編集(投稿者)

No83874 (ごじら さん) に返信
> 同時に複数のスレッドからアクセスしないようにする設定であることが理解できたのですが
> COMオブジェクト以外もこの設定の影響を受けるのでしょうか?

Windows API や .NET Framework のアセンブリの中には、
内部的に COM テクノロジーが使われているものもありますので、
そういった物は影響を受けるでしょう。Windows Forms などがそうですが、
Windows Message Loop を必要とする物は基本的に STA です。
http://www.kekyo.net/2013/07/22/382


ASP.NET などは既定で MTA になっていますので、IIS への組み込み時に
 %CommonProgramFiles(x86)%\System\ADO\ADOAPT15.REG
 %CommonProgramFiles(x86)%\System\ADO\ADOFRE15.REG
で、ADO のスレッドモデルを切り替えたりする場合もあります。
[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83875 ] / ▼[ 83879 ]
■83878 / 6階層)  Re[6]: Shell関数の使い方
□投稿者/ ごじら (5回)-(2017/04/18(Tue) 15:17:41)
ありがとうございます。

ちなみに、option strictを使わずに
object形式で遅延バインディングして使えば
MTAなスレッドでもエラーになりませんが
こちらの方が複数のCOMオブジェクトを呼び出せるため
高速処理が可能でしょうか?
それともMTAスレッドでも同時に一つしか呼び出せない仕様になっているのでしょうか?
 
[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83878 ] / ▼[ 83880 ]
■83879 / 7階層)  Re[7]: Shell関数の使い方
□投稿者/ Hongliang (528回)-(2017/04/18(Tue) 17:06:18)
> こちらの方が複数のCOMオブジェクトを呼び出せるため
> 高速処理が可能でしょうか?
関係ありません。
[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83879 ] / ▼[ 83881 ] ▼[ 83882 ]
■83880 / 8階層)  Re[8]: Shell関数の使い方
□投稿者/ ごじら (7回)-(2017/04/18(Tue) 21:22:04)
http://www.kekyo.net/2013/07/22/382
の記事などを見ると
MTAよりもSTAの方が遅いと書かれてあるので
shellを使いたいところだけデリゲートで呼び出す方が良いと思うのですが
合っていますか?
 
[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83880 ] / 返信無し
■83881 / 9階層)  Re[9]: Shell関数の使い方
□投稿者/ PANG2 (174回)-(2017/04/18(Tue) 23:01:02)
2017/04/18(Tue) 23:02:29 編集(投稿者)

.NETのマルチスレッドで高速化したいのであれば、COMではなくマネージドコードでやるべきでは?

元記事には、
>プログラムからMP3ファイルのID3タグ情報を得るには、MP3ファイルをオープンし、そのフォーマ > ット仕様(ID3.orgで規定されている)に従って順に読み出すこともできるが、

とあるし、ライブラリも検索すれば見つかります。

検索キー:C# id3
[ 親 83867 / □ Tree ] 返信 編集キー/

▲[ 83880 ] / 返信無し
■83882 / 9階層)  Re[9]: Shell関数の使い方
□投稿者/ Azulean (812回)-(2017/04/19(Wed) 06:28:14)
2017/04/19(Wed) 06:31:13 編集(投稿者)

No83880 (ごじら さん) に返信
> MTAよりもSTAの方が遅いと書かれてあるので
> shellを使いたいところだけデリゲートで呼び出す方が良いと思うのですが
> 合っていますか?

合っていません。
MTA として使えるようにするか、STA として使えるようにするか、それとも両方で使えるようにするかはその COM クラスを実装する人が選ぶものです。
今回の対象のクラスは STA のみでしか使えないように実装されているので、利用者に選択肢はありません。

また、STA のクラスを利用する場合、STA スレッドで生成・実行する必要があるので、別スレッドからそのオブジェクトを操作しようとしても、必ず STA スレッドに委譲されるので、並列に実行できません。


このあたりをすぐに理解することは難しいとは思いますが、少し見かけた内容だけで「こうではないか?」と思うのは危うい兆候に見えます。
1つのページで立てた仮説、推測は複数の資料にあたって裏付けが必要です。
(Web 上には誤った理解、情報が掲載されている可能性があるため)
[ 親 83867 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -