AnyCPU

Windows7 64ビット版にはまってしまいました。

 あるプログラムで、これまではVISTAまで32ビットOS対応ということで、ビルド時にターゲットCPUをAnyCPUとしていた(というか、デフォールトのまま)のですが、ライセンスロジックの部分がUSBメモリーを見に行くような処理にしていたため、この部分で、こけてしまいました。

 今日、ユーザーから電話があり、Windows7で使用するとライセンスエラーが出てしまうということ、USBメモリーはコンピュータに挿入したときに光るので、認識しているようで、プログラムを起動したときにはアクセスランプが点滅しないとのこと、起動時にUSBメモリーを見に行っているので、プログラムから認識していないような感じなので、OSを聞いてみると、Windows7 Proffesional 64ビット版とのこと、32ビット版では正常に認識して動いていたので、UACなど管理者権限での問題かと思い、しきりに電話では、あれこれやってもらったのですが、現象が変わりません。

 先ほどから、Windows7 64ビットに、当該の実行プログラムを持ってきて、ライセンス用のUSBメモリーを挿して、いざ実行、としたら、お客さんの言う通り、ライセンスエラーが発生し、しかもUSBのアクセスランプが点滅しない。

 いやいや、これはと思って、USBメモリーにアクセスする部分のロジックのテストモジュールのプロジェクトを、VISTA(32ビット)から持ってきて、確認したら、やはりUSBデバイスを認識してくれません。

 デバッガーで追っかけると、Win32APIのsetupapi.dll中のSetupDiGetDeviceInterfaceDetail関数で常にfalseの結果を返していることがわかりました。

 でも、何でだろうと、よくよく考えたら、ビルドのターゲットCPUがAnyCPUになっていたからだということを思い出しました。

 そうだ、このUSBの部分って、64ビット対応にしようと思って、どうも64ビットでWin32APIを呼びだすのが分らなくて、32ビットのままでいいやと思って、そのままにしていたのを思い出しました。

 その代わり、64ビットOSでは、ターゲットOSをAnyCPUとしてしまうと、64ビットのモジュールとして動くということがわかり、32ビットととして動かすには、ターゲットCPUをx86と明示しないといけないということを知ったつもりでいました。

 で、そのままにしていたので、すっかり忘れていたのでした。

 ターゲットCPUをx86にすることで、とりあえず、この問題を回避することができました。

 Win32APIを64ビット化するにはどうしたらいいのかという、基本的な問題は、全く進んでいないのでした。

 こうやって、問題の解決が、後回しにされるんですね。他人事のようですが。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのトラックバック