PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.10 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆C++でUSB(HID)アクセスプログラムを作成 PIC側のプログラムはC18コンパイラを使わずPICアセンブラで作成しますが、パソコン側のUSB(HID)アクセスプログラムはBorland C++コンパイラで作成します。 しかしこれがまた難物で悪戦苦闘の連続でありました。 |
[第43回]
●「外部シンボル …が未解決」
今回は、2ヶ月も前に書きました、[第40回]からの懸案でありました、「外部シンボル …が未解決」という意味不明のエラーがいよいよ、といいますか、やっと「解決」いたします。
わかっていらっしゃる方には、何てこともないようなエラーメッセージなのでしょうけれど、全然わかっていらっしゃらない私といたしましては、こういう意味不明のメッセージに直面すると、もうどこから手をつけていったらよいものか、途方に暮れてしまいます。
これが昔ですと、中区栄の丸善とか星野書店とかなどに足を運び(ああ。当地名古屋のお話です)、専門書のコーナーに入り浸りで片っ端から目次や索引をめくってまわる、ということになるのでありますが、今は有難い時代で、たいていのことはインターネットでけりがついてしまいます。
で、ネットで検索をして回りましたところ、なんとか見えてまいりました。
どうやら、この「未解決」というのは、そういう関数がみつからないよ、ということを意味しているらしいのですね。
うう。それなら、業界用語などをお使いにならないで、「みつからない」と直截におっしゃっていただきたいですう。
そんなわけのわからない業界用語をお使いになるものですから、パラメータがおかしいのか、とかまたWindowsのバージョンが違うのか、など悩まないでもよいところで悩んでしまって、何日も空費してしまうのでありますから…。
はなから、「みつからない」と言っていただければ、それはそれでいくらなんでもこれはおかしいぞ、ということで、それなりに調べ方もありますでしょうに。
だってincludeしておりますヘッダーファイルを調べましたら、ちゃんと定義してあるじゃありませんか。
Hidsdi.hの前半部分を以下に示します。
/*++ Copyright (c) 1996 Microsoft Corporation Module Name: HIDDLL.H Abstract: This module contains the PUBLIC definitions for the code that implements the HID dll. Environment: Kernel & user mode Revision History: Aug-96 : created by Kenneth Ray --*/ #ifndef _HIDSDI_H #define _HIDSDI_H #include <pshpack4.h> //#include "wtypes.h" //#include <windef.h> //#include <win32.h> //#include <basetyps.h> typedef LONG NTSTATUS; #include "hidusage.h" #include "hidpi.h" typedef struct _HIDD_CONFIGURATION { PVOID cookie; ULONG size; ULONG RingBufferSize; } HIDD_CONFIGURATION, *PHIDD_CONFIGURATION; typedef struct _HIDD_ATTRIBUTES { ULONG Size; // = sizeof (struct _HIDD_ATTRIBUTES) // // Vendor ids of this hid device // USHORT VendorID; USHORT ProductID; USHORT VersionNumber; // // Additional fields will be added to the end of this structure. // } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; BOOLEAN __stdcall HidD_GetAttributes ( IN HANDLE HidDeviceObject, OUT PHIDD_ATTRIBUTES Attributes ); /*++ Routine Description: Fill in the given HIDD_ATTRIBUTES structure with the attributes of the given hid device. --*/ void __stdcall HidD_GetHidGuid ( OUT LPGUID HidGuid ); |
(これより前の部分省略) Revision History: Aug-96 : created by Kenneth Ray --*/ #ifdef __cplusplus extern "C" { #endif #ifndef _HIDSDI_H #define _HIDSDI_H (この間省略) #ifdef __cplusplus } #endif |
つまり、もしC++でコンパイルするならば、このソースプログラムの、その位置に
extern ”C” {
を置いて、そしてソースプログラムの最後のところにも、もしC++でコンパイルするならば、最後のその位置に
}
を置きますよ、ということです。
Hidsdi.hにそのようにして書き加えたものをHidsdi2.hとして作業中のフォルダに置き、そしてテストプログラムHidtest1_8_d.cppの、
#include "hidsdi.h"
を
#include "hidsdi2.h"
に直してから、コンパイルしてみました。
おお。エラーは出なくなりました。
うう。
しかし。
最初は、ちょいとかっこいい、と思った、
#ifdef __cplusplus
ですけれど、よくよく考えてみると、それもなんだか回りくどいのではないですかあ。
「もしも」、も何も、私ははじめからC++を使うつもりなので、そのほかの言語を使うつもりはさらさらありませんから、この #ifdef
__cplusplus は全く余計な気がします。
それならば、いっそ、こんな具合にできませんかねえ。
Hidsdi.hはもとの最初のままのものを使うことにしまして、HIDテストプログラムの、
#include "hidsdi.h"
のところを、
extern "C" { #include "hidsdi.h" } |