※ ChatGPTを利用し、要約された質問です(原文:DLL登録プログラムに関して)
Vista対応のDLL登録プログラムの課題と解決策
このQ&Aのポイント
Vistaに対応するためDLLの登録プログラムを自前で作成していますが、登録がうまくいかないことがあります。regsvr32で登録した場合も同じような現象になります。問題の一つとして、レジストリに記憶されるファイルパスが日本語を含む場合文字化けしてしまうことがあります。また、ファイルパスの短い形式で記憶される問題もあります。
文字化けしたパスはアプリケーション側で認識できず、オブジェクトの生成に失敗してしまいます。これを回避するためには、ファイルパスを文字化けしない形式でレジストリに記憶する必要があります。
フルパスで記憶されるDLLと短い形式で記憶されるDLLの違いは互換性の問題です。互換性を維持するためには、フルパスで記憶するように修正する必要があります。DLLを修正することで問題を解決することも可能です。修正が難しい場合は、登録プログラムの修正を検討しましょう。同様の問題に遭遇した方は共有して解決策を見つけることができます。
Vistaに対応するためDLLの登録プログラムを自前で作成していますが、登録するDLLによって登録がうまくいかないことがあるので困っています。
regsvr32で登録した場合も同じような現象になります。
具体的には以下のような状況です。
・レジストリに記憶されるファイルパスが、日本語を含む場合文字化けしてしまいます。
この場合、文字化けしたパスを認識できずアプリケーション側でオブジェクトの生成に失敗してしまいます。
文字化けしないようにするためにはどのようにすればよいでしょうか?
・また、レジストリに記憶されるファイルパスが短い形式で記憶されます。
フルパスで記憶されるDLLとされないDLLがあるのですが、これはどのよう
な違いでしょうか?
互換性維持のためフルパスで記憶するようにしたいと思っています。
※DLL自体は私がVC6で作ったものです。
たとえばデスクトップ上にあるDLLをした結果このようになります(作成したDLL)
結果:C:\DOCUME~1\user\デfスXクN~1\regit.dll
期待値:C:\Documents and Settings\user\デスクトップ\regit.dll
しかし一方で他のDLLではこのように期待度どおりの結果になります(他のDLL)
結果:C:\Documents and Settings\user\デスクトップ\my.dll
作成したDLLの開発環境は以下のとおりです。
・Windows XP Home Edition
・Visual C++ 6.0
できればDLLを修正することで解決したいと思っています。
不可能であれば、登録プログラムの方を修正する方向で考えています。
同じ現象に出くわした方がいらっしゃれば、どうかお力添えください。
よろしくお願いします。
お礼
ご回答ありがとうございます。 確かにATLで作成しており、深くまで下っていくと GetShortFileNameという関数を使っていることがありました。 これらを書き換えると、長い名前で作成されるようになりました。 しかしながら「日本語パスの文字化け」は直りませんでした。 Webで検索すると同じ問題でつまづいている方もいたようですが、 良い回答にはいたっていませんでした(日本語パスを含まないSystem32に置くことで解決していたようです。 しかしながら私の場合はSystem32に置く実装にしたくないと思っています) 日本語が文字化けをするのも自分で書き換える必要があるのでしょうか(もしくはVC6の仕様と認識すべきですか?) 問題が解決するまで引き続きよろしくお願いします。
補足
その後調べてみた所、ATLの読み込み前に #define UNICODE を追加した所、日本語でのレジストリの登録がうまくいくようになりました。 どうやら初歩的なところでつまづいていたようです。 無事に必要要件を満たすことができました。ありがとうございました。