LoadLibraryが失敗するとき
DLLを明示的に利用するとき
LoadLibraryしますが、DLLが存在するのに失敗することがあります。
DLLがほかのDLLを暗黙的に利用していて、ほかのDLLが存在しないときに失敗します。
/Debug/a.exe
/Debug/b.dll
/Debug/c.dll
/Release/b.dll
/Release/c.dll
a.exeがb.dllを明示的に呼びだす
b.dllはc.dllを暗黙的に呼びだす
/Debug/a.exe
↓
/Release/b.dll
こんな構成の場合、失敗するときと成功するときがあります。
起動時は失敗するのだが、起動後は成功しました。
この場合、
/Release/b.dll は /Release/c.dll を使ってくれない
/Debug/c.dll が利用されるはず。
ここに危険な罠が含まれているような気がします。
ただの設定ミスだったんですが…
参照設定にはまった
いやーーーー、ほんとにはまりました。
約3時間。
原因がわからず、その途中で違う問題を発生させて…
VCで参照設定で、ソリューション内のライブラリのプロジェクトを参照設定に追加すると
libファイルの指定等が不要になります。
しかし、コンパイルしてもリンクできないんです。
プロジェクトに設定しているディレクトリが違っていたんです。
substでCドライブの深いところをLドライブとかに設定をしていました。
通常は、Lドライブで作業をしているのですが、
コンパイルがうまくいかずに、プロジェクトを外した追加したりいろいろしているときに、Cドライブ側から追加していたんです。そうすると、プロジェクトがCドライブで、プロジェクトの参照設定されているプロジェクトは、Lドライブ。
ただ、実際は、同一のディレクトリなのでlibファイルは存在しているし、あまり問題がなさそうだが…
VC君は、うんとは言ってくれないんです。
プロジェクトを選択しているときのプロパティで実際のディレクトリパスが表示されているので、なんか変だなーと思ったら確認しましょう。
UINTがいないとか、HANDLEがいないと言われた時は、classの最後の ; があるか確認してみてください。
はあ、、、しんどい。
クリップボードリング
コーディングする際に、クリップボード拡張系のソフトがないと非常にめんどくさいです。
自分の環境では、クリップボード拡張ソフトがインストール済み。
ほかの人のマシンでコーディングする際、あと、アプリを勝手にインストールしたらダメな環境とか
そんなとき、
クラス名コピーしてきて、includeする際に
#include "***.h"
をコピーして、あ、クラス名が消えたって思ったことありませんか?
そんなときは、VisualStudioのクリップボードリング
Ctrl+Shift+V
で、ひとつ前のクリップボードが表示されます。
順番に、何十個か表示されます。
VisualStudioでC++の場合に便利です。
UNICODEのファイルを作成する
VCでUNICODEにするのは、プロジェクトの設定。
しかし、それではアプリの中がUNICODEで動作するようになるだけ。
その文字列をファイルに出力しようとしてもUNICODEにはならない。
はじめはそれがとても不思議な感じがしたが、いまではそっちのほうがしっくりくる。
fstreamもUNICODEが出力できるようになると一番うれしいのだが。。
ファイルをUNICODEで出力したい場合、
std::fstreamにバイナリ形式で文字列を出力するだけ
std::wfstreamではうまくいかない。
ここは注意が必要。
あと、このファイルは、IEではUTF-16とは認識されない
0xFFEF 0xEFFF BOM?がないとだめなようだ・・・
※まだ未確認。未確認情報を書くなって…
テンプレートの特殊化
C++テンプレートテクニックを買ってお勉強。
テンプレートの特殊化を利用して、いままで使っていたライブラリを一部書き換え。
構築した部分は問題なく実装できたが、いままでやっていたことができなくなった・・・
どちらともいえない、どちらともいえない。
バイト列への便利なアクセス関数なのだが、いままでいろんな処理をぐちゃぐちゃしていた。
だれかの作った関数を理解せずに改良していた。
・△ビットから○ビットまでをunsigned longとして取得
・△ビットから○ビットまでをlongとして取得
・3バイトをunsigned longとして取得
はい。。ビット操作が苦手です。
情報処理試験の1章、2章あたりが苦手です。
予想以上に簡単な処理になっちゃった。
いままでのコードはなんだったんだ・・・
5バイト以上のバイト列にも簡易アクセスしたいな・・・
これは意外とむずかしい。
コンパイル時に処理を解決することで高速に処理が終わるようになった
unsinged char value = 0xAA; // 10101010 unsigned long bit6_3 = GetBitsUnsignedLongByPos<1,5,3>(&b); // 101
こんな風に書けるようになった。
コンパイル時にビット番号が解決できていないとだめ。
ほとんど大丈夫だけど、ちょっとダメなパターンが。。。
SQLiteを利用しやすいようにクラス化
昨年末、隣席の人がEntier(Hitachiの組み込みDB)のライブラリを書いてた。
ちょいちょい見たり話をしたりしていたが、同じようなものを書くことになった。
もっとちゃんと聞いておけばよかった…
class Connection;
class Statement;
class PrepareStatement : public Statement;
class ResultSet;
class Reciever;
こんな感じ。
あとは、Prepareの実装だ。
Entierでも動くような感じにするのは、めんどくさそう・・・
JDBCの作りこみだ・・・
WindowsMobileでも動作することを確認しなくちゃ。。
あと二日で完成するか??
SQLiteで引っかかったところ
SQLを8年ぶりぐらいに書いた。
SQLite関係なく、ぜんぜん書けない。
- PrimaryKeyを複数のカラムで指定する
- create table sample (id integer, age integer, name text, primary key(id, age) )
- primary key を後でまとめて指定するとできる。
- SQLiteでは、primaty key をalterで変更できないっぽい
- insertが遅いなと思った
- トランザクションを使ってなかった
begin transaction;
(〜いろんな処理〜)
commit;
SQLite関係ない話ばっかりヾ(-_-;)