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"
}
|
