- PR -

DLLの呼び出し失敗

1
投稿者投稿内容
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2006-11-09 16:17
C#で作成したDLLをVC++6から使用しています。

COMとして利用できるように
regasm xxx.dllとして登録を行っています。
(dllには、厳密名はつけていません)

そして、VC++6で作成したexeと、dllを同じフォルダに入れることで
動作していたのですが、

なぜか、作成したものを他の環境に持っていくと呼び出しに失敗します。
このような状況の原因となりうるものには何が考えられますでしょうか?

作成した環境は、VisualStudio2005 Professional、WinXP

動かない環境にも、.NET2.0はインストールしてあります。OSはWinXP,or 2000

[ メッセージ編集済み 編集者: たけ 編集日時 2006-11-09 16:25 ]
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-11-09 16:42
引用:

regasm xxx.dll


フルパスにしないと不味いかも。
(exeのある位置のDLLというようなものではない)
よって、
引用:

そして、VC++6で作成したexeと、dllを同じフォルダに入れることで
動作していたのですが、


この認識は間違いのような。
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2006-11-09 17:44
>フルパスにしないと不味いかも。
すいません、regasm xxx.dll は、フルパスを指定しています。

>この認識は間違いのような。
http://www.sev.or.jp/ijupiter/world/dc_interrop/dotnet_com_interrop.html
↑のサイトを参考にしました。
--- 引用 ---
配布したいVB用アプリケーションのexeと同じフォルダに.NET DLLを配置してregasm.exeを実行すればいいだけ
------------
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-11-09 19:47

なんとなーくですが、regasm.exe を開発機でだけ実行してませんか?
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2006-11-10 06:54
ご意見ありがとうございます!

>なんとなーくですが、regasm.exe を開発機でだけ実行してませんか?
実は、最初忘れてました。
でも、開発機以外でも同様におこなったのですが、やっぱり
呼ぶことができませんでした。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-11-10 11:10
実行環境で

・適切な .NET ランタイムが導入済み
・regasm し忘れていない

であるなら、後は .dll ファイルのアクセス権が不正(=読み取り・実効許可が無い)くらい?

てか、「呼び出しに失敗」するのは分かりましたが、その時の詳細エラーコードくらい分からないんですか?


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-11-10 11:32 ]
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2006-11-10 12:24
>・適切な .NET ランタイムが導入済み
>・regasm し忘れていない
上記は問題ないですね。

>であるなら、後は .dll ファイルのアクセス権が不正(=読み取り・実効許可が無い)くらい?
こちらは、OSのファイル毎のアクセス権のことですよね?
こちらはチェックしてないです。

>てか、「呼び出しに失敗」するのは分かりましたが、その時の詳細エラーコードくらい分からないんですか?
たしかに、戻り値のチェックはするのが基本ですね。

ちょっと、環境が手元にないのでまたチェックしてご報告します。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-11-10 13:50
引用:

>であるなら、後は .dll ファイルのアクセス権が不正(=読み取り・実効許可が無い)くらい?
こちらは、OSのファイル毎のアクセス権のことですよね?



そうです。

が、ファイルのアクセス権が問題になるのは、インストールを行ったのとは別のアカウントでアプリケーションを実行した場合がほとんどです。

アプリケーションの導入を行ったアカウントで実行しているなら、通常は問題になることは無いはずです。

アクセス権で言えば、.NET な .dll の内部でログファイルやイベントログの書き出しなんかをやっている場合、それが許可されていない or 事前準備不足などによって、CoCreateInstance() に失敗することもあるでしょうね。

そこまで行くと、モジュール固有の作りこみによって発生する問題なので、ソースでも見ないことには原因を特定できませんが。

引用:

>てか、「呼び出しに失敗」するのは分かりましたが、その時の詳細エラーコードくらい分からないんですか?
たしかに、戻り値のチェックはするのが基本ですね。



CoCreateInstance() の戻り値(HRESULT)で、クラスの登録がされていない等、原因の特定につながる情報が得られることもあります。

1

スキルアップ/キャリアアップ(JOB@IT)