2009年5月29日金曜日

Win32 Help(.hlp)をHTML Help(.chm)にする

VB6→VB2005のアップグレードの続きなんですが(この前のとはまた別のアプリ)、コンテキストヘルプの呼び出しのところでアップグレードできませんでした。呼んでるヘルプがWin32 Help(.hlp)で、VB2005ではこれに対応していないのが大本の原因です(もちろん呼び出し方も修正しないといけないけど)。VB2005で使えるのは(というか.NETアプリから呼べるのは)HTML Help(.chm)です。
しかし.hlpファイルを.chmファイルに変換するソフトって、存在するにはするんですけど、有料のしかなさそうです。そう何回も使うものでもない(と思いたい……)のでできれば無料のもので済ませたい。
結局、
.hlpファイル→Universal Extractorで展開→HTML Help Workshopで変換、修正、コンパイル
とフリーウェアのみで変換することができました。詳細は次の投稿で。

2009年5月26日火曜日

VB6→VB2005 アップグレード

VB6(Xp)で作成したプロジェクトを、VB2005(Vista)へアップグレード。

VB6のソース(プロジェクト)をXp環境からVista環境にコピー→VB2005で開く→アップグレードウィザードが起動→ひとまず移行完了

と、だいたいのプロジェクトはOKだったんですが、ひとつ移行できないものが。アップグレードウィザードの最後にエラーが出て(エラー内容忘れた……こういうのはすぐ控えとかないとだめですね)、移行できませんでした。ソリューションエクスプローラが空の状態(プロジェクトが無い)で終了。エクスプローラでフォルダを見ると、ファイルはあるので、個々のソースの変換はできてたようです。
ここで、VB6のプロジェクトをVista環境で(VB6のまま)ビルドしてなかったことを思い出し、ビルド。すると、最後に、

システム レジストリへのアクセスでエラーが発生しました。

と出て、ビルド失敗。
ググってみると、どうもレジストリに権限がないのが原因らしい。いちいち調べるのめんどくさい……と思ったけど、ふと思い出して、VB6を右クリック「管理者権限で実行」から起動してみることに。そしたらあっさりビルド成功。
続いて、このプロジェクトを、同じく「管理者権限で実行」から起動したVB2005(VS2005)で開いてみると、今度はアップグレード正常終了。
試しに再度、普通に(管理者権限オプション選ばずに)起動したVB2005からアップグレードしてみたら、これも正常に終了。
結局、最初にVista上でVB6のビルドが通ってなかったのが原因だったのか……。
なんか内容整理できてませんがとりあえずメモ。

2009年5月21日木曜日

DLL修正ではまる

ずっと昔に他の人(退職しちゃっててもう居ない)がVC6で作成したDLLを修正することになりました。引数を1個追加するだけなので簡単……と思ったら、コンパイルは通るけどリンクでエラー。

リンク中...
ライブラリ .\Release/Test.lib とオブジェクト .\Release/Test.exp を作成中
Test.exp : error LNK2001: 外部シンボル "_TestFunction@16" は未解決です
Test.exp : error LNK2001: 外部シンボル "_TestFunction@16" は未解決です
.\Release\Test.dll : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー

Test.dll - エラー 3、警告 0

と、結構ありがちなエラー。外部シンボルが未解決というと、.defファイルに書いてる関数名が間違っているというのがパターンなんですが、何度見直しても合ってるし……。.defファイルはこんな感じ。

EXPORTS
TestFunction = _TestFunction@16 ;VB用の export
_TestFunction@16 ;VC用の export

関数名は合ってると。では怪しいのは @16 なんだけどこれって何?
.defファイルの書式やらをググると、@の後の数字は序数で……とか書いてあったりするのですが、この場合は違いました。さらにキーワードを変えつつググっていたら、やっとそれらしい情報に到達。

C の装飾名の形式

関数宣言時の呼び出し規約が __stdcall の場合、.defファイルで記述するCの装飾名の形式は、

先頭にアンダースコア (_) が付き、末尾にアット マーク (@) が付き、その後ろにパラメータ リストのバイト数が続きます。

ということでした。つまり @16 というのは関数の引数リストのバイト数合計が16バイトということだったのですね。
今回は引数を追加したわけなので、そのバイト数分増やさないといけなかったのです。
4バイトの引数を1個追加したので、@16 → @20 に修正してリビルドしたら……リンク通りました。

なんかこれだけ調べるのに丸1日以上かかってしまったよ。とほほ。最初はVC6の環境がなくてVC2005で開いてやってたから、そのせいかもと思って古い環境でやり直したりとか……。
DLLの作成方法にはいろいろあって、.defを使用しない方法もあるんですけど、今回は修正元が使ってたのをそのまま使ったので。

ブログはじめました

このブログにはWindowsのアプリ開発Tipsとかトラブルシューティングとかを書こうと思ってますが、自分用のおぼえがきのつもりなので、他人が見るには不親切な記述があるかと思いますがご容赦願います。何かありましたらコメントください。