標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第472回]

●欠落エクスポート…の結末

前回([第471回])、コンパイルOKになったテストプログラムを実行したところ、

HIDTEST1_8_D.EXEファイルは
欠落エクスポートHID.DLL:_HidD_GetAttributes@8にリンクされています

という、これまた全く意味不明のエラーメッセージに遭遇してしまいました。

意味不明ではありますけれど、このエラーメッセージにつきましては、おおよその見当はつきます。
HID.DLLのリンクで何か問題がおきた、ということでしょう。

HID.DLLのリンク、ということですと、すぐに頭に浮かぶのが、[第469回]で作業をしました、HID.LIBです。
HID.LIBはBorland C++のライブラリには含まれていませんでしたので、Win98DDKから持ってきたものを使いました。
そうしましたら、

Error: ’C:CPP¥USB2¥HID.LIB’ contains invalid OMF record,type 0x21(possibly COFF)

というエラーが表示されてしまいました。
どうやらHID.LIBがBorland C++のファイル形式に合わないとのことらしく、その形式を変換するのに、COFF2OMFというソフトを使いました。

一方、[第470回]では、「外部シンボル…が未解決」というエラーが表示されました。
どうやらこれも、HID.DLLにリンクするための、「名前の解決方法」が’C’と’C++’で異なるために、リンクの情報がうまく適合しない、ということのようです。
その対策として、extern ’C’を使いました。

そのようにしてコンパイルまでやっとこぎつけたHIDテストプログラムを実行したところ、「欠落エクスポートにリンクされています」というエラーが出てしまったのですが、いままでのいきさつからして、[第469回]から[第470回]で行った作業のどこかに問題があったのではないか、ということはおおよそ見当がつきます。

このエラーメッセージについては、2月の時点で、表示されることを確認していたようなのですが、どうもはっきり記憶がありません(困ったものです)。
ですから、どのようにして、それを解決したのかも、当然のことながら、全く記憶にないのですけれど、幸いそれをたどるてがかりはありました。

今回のHIDテストプログラムは、今まで説明してきましたように、もうほとほと嫌になるほどのエラーが出て、それをひとつひとつ解決しながら進まなければならなかったこともあって、テスト作業用にいくつかのフォルダを用意して、そこに必要なファイルをコピーしながらカット・アンド・トライを進めてきました。

で、今回の説明のために用意したフォルダでのコンパイル作業では、その結果作成されたEXEプログラムを実行すると、「欠落エクスポート…」というエラーが発生してしまうのですが、2月のころに作業していたフォルダに残されていたEXEファイルを実行しても、エラーは発生しないことが確認できました。
ちゃんと解決済みだったのです。

そこで、エラーが発生するフォルダと発生しないフォルダの中身を比較し、またそれぞれの中身をさらに別のフォルダにコピーしてコンパイル〜実行を試行してみる、という作業をした結果、2月に到達していたであろう解決にふたたび行きつくことができました(やれやれ)。

問題はWin98DDKから持ってきたHID.LIBにありました。
このHID.LIBそのものに問題があるのかどうかはわかりません。
ただ、このファイルのままではBorland C++ではコンパイルできなかったために、COFF2OMFというソフトを使って変換したのですが、その変換後の「HID.LIB」が問題だったようです。

では、それをどのようにして解決したのでしょうか?

じつは、そこで、[第469回]で説明しました、もうひとつのHID.LIBの作成ツール「IMPLIB」を使ったのです。
もとからWINDOWS¥SYSTEMにあるHID.DLLをもとにして、それからIMPLIBによって生成したHID.LIBを使ってコンパイルして作成されたEXEファイルを実行してみたところ、エラーは発生しませんでした。

印象としてはなんとなくIMPLIBよりもCOFF2OMFのほうが確からしいように思えたので、今回も、そして2月の時点でも、最初にまずCOFF2OMFを使ってHID.LIBを変換してしまったために、エラーに遭遇することになったのでした。

COFF2OMFとIMPLIBを使ってHID.LIBを変更、生成してからHIDテストプログラムをコンパイルし、その結果作成されたEXEファイルを実行して、そのことを確認してみました。

COFF2OMFを実行したあと、コンパイルして(bcc32)できた、hidtest.exeを実行すると、エラーが表示されます。

hidcoff.libというのは、WIN98DDKからもってきたhid.libをリネームしたものです([第469回]COFF2OMF)。

IMPLIBを実行したあと、コンパイルしてできた、hidtest.exeを実行すると、エラーは表示されず、正常に実行されました。


ところで、今回の作業ではWindows98SEのWINDOWS¥SYSTEMにあるHID.DLLをもとにして、HIDテストプログラムを作成したことになりますから、果たしてこのプログラムがWindowsXPで正しく動作してくれるのかどうか、そこが気になるところなのですが、WindowsXPでも試してみた結果、問題無く実行できました。

どうやら今度こそ本当に、めでたしめでたし、のようです(やれやれ)。
2010.4.7upload

前へ
次へ
ホームページトップへ戻る