まだまだ初心者です。質問させてください。
C++ではなくC言語で記述しています。
mdbからレコードを拾ってくる方法がよくわからず困っています。
MSDNや掲示板をちらちら見たところ、C++でのサンプルは見かけたのですが・・・。
(調べ方が甘いのかもしれません)
まず知りたいのは、
1.必要なインクルードや宣言
2.mdbのopenの仕方
このへんの取っ掛かりがわかれば自力で進めると思うので
ご存知の方、よろしくお願いします。
環境はwindows2000、Microsoft Visual C++6.0です。
ODBCを使うならこの辺り:
http://msdn.microsoft.com/library/en-us/odbc/htm/sqlapi.asp
DAOを使う場合はこの辺り:
http://www.microsoft.com/japan/developer/library/dao360/dahowdataaccessoverview
.htm
DAOはCOMコンポーネントなので、VBでもCでも扱いは同じです。
VB向けの説明を読み替える必要があります。
使ったことはありませんが、
Active Data Objects (ADO) というのもあります。
これだけでは、DBを開く取っ掛かりにもならないと思いますが、
どのAPIを使うのかが不明なので、このくらいで。
dairygoods さん、早速のresありがとうございます。
私はCはかじっていましたが、C++はまだ使ったことがありません。
VBもそれほど数をこなしていません。
APIはCAD系のカスタムのAPIを使ってます。実行ファイルはdllが作成されます。
(うまく説明できません・・・すみません。)
DAOを使いたいのですが、「DAOを使う場合はこの辺り」の
サイトがみつからないというメッセージが出てきてしまいました。
お手数ですが、もう一度参照可能なサイトを教えていただけませんか?
>DAOを使いたいのですが、「DAOを使う場合はこの辺り」の
>サイトがみつからないというメッセージが出てきてしまいました。
ちかりんさん、URL を示す下線が .htm 以前までしか無いので、リンクが不完全なのです
マウスでクリックするのではなく、URL を範囲指定でコピーして、ビューワーが IE なら
アドレスにペーストして見に行ってください
> DAOを使いたいのですが、「DAOを使う場合はこの辺り」の
> サイトがみつからないというメッセージが出てきてしまいました。
URLが改行されてしまっているので、つなげてみてください。
C言語からCOMを使ったことは無いのですが、
C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll
にタイプライブラリがありますので、
これからC言語用のヘッダーを生成できるはずです。
ところで、「C言語で書かなければならない」という状況でないのならば、
C++やMFCを使ったほうが簡単ですので、そちらをお勧めします。
>C言語からCOMを使ったことは無いのですが、
>C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll
>にタイプライブラリがありますので、
>これからC言語用のヘッダーを生成できるはずです。
ほんとに?
そもそも COM のインターフェース自体、VC++ では純粋仮想クラスとして表現されるも
のなので、C 言語仕様内で扱うのは困難だと思うんですが。。。
コンパイラとして VC++ を使っているなら、C++ 言語で記述された「関数」程度なら C
言語でも比較的容易に扱えますが、クラスを扱うのはかなり苦労します。
純粋に C 言語レベルでデータベースを扱うとすると、(あれば)DB毎に用意されたラ
イブラリを使うか、ODBC を使う以外に方法は無いと思います。
ODBC なら、unix 系 OS からでも利用が可能なようですから、普段そういう低位の API
に慣れ親しんでいる人なら特に問題なく使いこなせると思います。
> そもそも COM のインターフェース自体、VC++ では純粋仮想クラスとして
> 表現されるも
> のなので、C 言語仕様内で扱うのは困難だと思うんですが。。。
純粋仮想クラスはC言語から見ると、
関数ポインタの一覧をメンバーに持つ構造体です。
MIDLが生成するインターフェイスヘッダーファイルを見てみると、
次のような感じでCとC++用のインターフェイスが定義されているの
が分かると思います。
#if defined(__cplusplus)
class IText {
public:
virtual HRESULT FuncA() = 0;
virtual HRESULT FuncB(int arg) = 0;
};
#else
struct ITestVtbl {
HRESULT (*FuncA)(ITest* pThig);
HRESULT (*FuncB)(ITest* pThig, int arg);
};
struct ITest {
struct ITestVtbl* lpVtbl;
};
#endif
C言語でCOMインターフェイスを呼び出す場合、次の形式になります。
ITest* pText;
pText->lpVtbl->FuncA(pText);
>MIDLが生成するインターフェイスヘッダーファイルを見てみると、
>次のような感じでCとC++用のインターフェイスが定義されているの
>が分かると思います。
あれ? デフォルトでこんなの吐いてくれてましたっけ?
知らなかったです。。。 m(_ _)m
# けど、今更自分で AddRef(), Release() するのはイヤだな (^^;
> # けど、今更自分で AddRef(), Release() するのはイヤだな (^^;
そうですね。
MFCはともかく、C++を使って良いなら、
COMの部分だけでもC++を使ったほうがいいと思います>ちかりん 様
#importするだけで使えるし。
C++を使ってみようと思います。
MFCじゃなくてもいいんですよね?
→#importするだけで使えるし。
dairygoods さん、
MSDNを見てみましたがよくわからないので、
どうか一部分だけでも具体例を見せていただけませんか?
1)アプリケーションの開始時にCOMを初期化します
CoInitialize();
2)cppファイルでタイプライブラリをインポート
// EOFが名前衝突してしまうのでrenameします
#import ~\dao360.dll rename(EOF, DAOEOF)
3)DBアクセスするソース
using namespace DAO;
void function() {
_DBEnginePtr dbEngine;
HRESULT hr = dbEngine.CreateInstance(DAO.DBEngine.36);
DatabasePtr database =
dbEngine->OpenDatabase(_bstr_t(test.mdb));
// レコード処理
RecordsetPtr recordset = ...;
database->Close();
}
4)アプリケーションの終了時にCOMを片付けます
CoUninitialize();
一度コンパイルすると、dao360.tlhというヘッダーファイルができます。
その中に全ての定義がありますので、それを参照してください。
(VCプロジェクトに追加すればクラスビューでも参照できます)
VBでの例なら結構見つかるはずです。
あとは、DAOオブジェクトの解説と照らし合わせて類推して下さい。
dairygoods さん、ありがとうございます。
なんとか進めそうです。
ご意見をくださった皆様、ありがとうございました。