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++の場合に便利です。


C#はインテリセンス、コードスニペットが便利なのでそんなに困らない。

UNICODEのファイルを作成する

VCでUNICODEにするのは、プロジェクトの設定。
しかし、それではアプリの中がUNICODEで動作するようになるだけ。
その文字列をファイルに出力しようとしてもUNICODEにはならない。
はじめはそれがとても不思議な感じがしたが、いまではそっちのほうがしっくりくる。
fstreamもUNICODEが出力できるようになると一番うれしいのだが。。


VCのUNICODEは、UTF-16. >たぶん


ファイルを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)のライブラリを書いてた。
ちょいちょい見たり話をしたりしていたが、同じようなものを書くことになった。
もっとちゃんと聞いておけばよかった…


基本は、JavaJDBCのクラスを参考。

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で変更できないっぽい

begin transaction;
(〜いろんな処理〜)
commit;

  • テーブルが存在しているのに、createしようとして怒られる
    • dropすればよい
    • 存在していない場合に、dropで怒られる…
    • ファイルを消す。


SQLite関係ない話ばっかりヾ(-_-;)