DLL直接呼出し時の14001エラーについてNo.37096
緒方聡 さん 09/10/08 19:58
 
お世話になっています。

ライブラリに登録している以下のマクロ「hidebiff」で、エンドユーザ殿環境で以下
のエラーが発生しています。

http://hide.maruo.co.jp/lib/tkmacro/hidebiff-121.html

  マクロの代替指定されたDLLのロードに失敗しました。
  ファイル名 = X:\bin\macro\hidebiff.dll
  エラーコード = 14001

エラーコード 14001 について調べてみたところ、以下のページを見つけました。

http://hanac200x.cocolog-nifty.com/mitoudevelop/2007/02/post_6617.html
http://kom.xii.jp/2007/12/error_sxs_cant_gen_actctx.html

両方ともコード生成を「マルチスレッド DLL」から「マルチスレッド」に変更するこ
とで解決しています。

私のところでも同様にしてみたところ、私の環境では問題なく動作していますが、エ
ンドユーザ殿の環境では、エラーメッセージこそ出なくなったものの、「ToastNotif
y」が DLL 経由で起動しません。

環境の違いは以下のような感じです。

私:
 秀丸メール:V5.23

エンドユーザ殿:
 秀丸メール:V5.24β5 とV5.24β6

秀丸メール本体の LoadLibrary() で失敗しているっぽいのですが、何かアドバイス
いただけると助かります。

そもそも「マルチスレッド DLL」にしていたのは、生成するバイナリが DLL だから
に尽きるのですが、これを単に「マルチスレッド」にしてよいものなのかもよくわか
っていません。

私のところでも時間ができたら V5.24βを試してみようかと思います。

[ ]
RE:37096 DLL直接呼出し時の14001エラーにNo.37097
秀まるお2 さん 09/10/09 09:17
 
 そのエラーコードは僕は経験が無くてよく分かりませんが、たぶん、hidebiff
側がリンクしてるランタイムライブラリ(msvcXXXX.dll)が関係してエラーにな
ってるのだと思います。なので、ランタイムライブラリを「マルチスレッド
DLL」から「マルチスレッド」に変えるのは正しい判断だと思います。

 ちなみに上記2つの違いですが、DLLが付く方は、msvcXXXX.dllを呼び出す
(ダイナミックリンクする)という意味で、DLLが付かない方は、ランタイムラ
イブラリをスタティックリンクする、つまり、ランタイムライブラリのプログラ
ムコードを自身のプログラムの中に埋め込む、という意味になります。

> 私のところでも同様にしてみたところ、私の環境では問題なく動作していますが、エ
> ンドユーザ殿の環境では、エラーメッセージこそ出なくなったものの、「ToastNotif
> y」が DLL 経由で起動しません。

 ToastNotifyを呼び出す方法がどうなってるのか分かりませんが、プログラム
起動する方法はShellExecuteとかCreateProcessとかいくつかあると思うので、
それらいろいろ試してみるとか…、あと、エラーコードを画面に出すようにして
みて、そのエラーコードを教えてもらうとか…

 あるいはそもそもそこのユーザーさんの所でToastNotifyが起動可能なのかど
うか、スタートメニューの「ファイル名を指定して実行...」の所から確認して
もらうとかってことも最初に確認してみた方がいいかもしれません。もしそれで
ToastNotifyが起動しないということなら、根本的にどうにもならないというこ
とが言えると思います。

 もし根本的にどうにもならないとしたら…、とりあえずmsvcXXXX.dll(たぶん
msvcp80.dllとか?)がおかしいという可能性については、.NET Frameworkをイ
ンストールしてもらうことで直るかもしれません。

参照:
http://konuma.txt-nifty.com/blog/2006/02/msvcr80net_fram_e4c9.html


 それと、秀丸メールについて、V5.23からV5.24βにかけて、この辺の問題に関
係した修正が入ってるってことは無いと思います。

[ ]
RE:37097 DLL直接呼出し時の14001エラーにNo.37098
秀まるお2 さん 09/10/09 09:28
 
 それと補足ですが、ToastNotify自身はmsvcXXXX.dllは呼び出して無いようで
す。

 (Visual Studioに付属しているdumpbin.exeってツールを使うと、どのDLLの
どの関数を呼び出してるか分かります)

 秀丸メールもmsvcXXXX.dllは使って無くて、ランタイムライブラリはスタティ
ックリンクしています。

[ ]
RE:37098 DLL直接呼出し時の14001エラーにNo.37099
緒方聡 さん 09/10/09 10:34
 
お世話になってます。

> ちなみに上記2つの違いですが、DLLが付く方は、msvcXXXX.dllを呼び出す
>(ダイナミックリンクする)という意味で、DLLが付かない方は、ランタイムラ
>イブラリをスタティックリンクする、つまり、ランタイムライブラリのプログラ
>ムコードを自身のプログラムの中に埋め込む、という意味になります。

そういうことなんですね。
完全に意味を取り違えていました。

MD でリンクしたほうは MSVCP80D.dll と MSVCR80D.dll を要求しているので、確か
にエンドユーザ環境では動作しない可能性があります。そういうことなら作り直そう
かと思います。

ちなみに ToastNotify は、ini ファイルからパスを取得して、CreateProcess で起
動しています。ini ファイルの設定から確認してもらう必要がありそうです。

[ ]