カテゴリ:C/C++/Win32( 131 )

e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Windows Server 2003へRoxio Drag to Discをインストールする方法

Roxio Drag to Discは、Widnows Server 2003系OSへ正式対応していないため、インストール出来ませんが、ちょっとした工夫でインストール出来るようになります。
また、動作も安定しています。

やり方は、インストーラのEXEファイルのプロパティの互換性タブを開き、互換モードで「Windows XP」を選ぶ。
それだけです。
[PR]
by isoq | 2008-08-26 16:04 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Widnows で パラレルポートへアクセスする方法

一般的PCに標準で付いていて、簡単に使えるIOポートがパラレルポートです。
Windows NT系OSになってからは、直接IOをたたけなくなったので、余計なおまじないが必要になりました。
最近、パラレルポートを使いたい事があったので、探して見つけたのが、PortTalk。
インストールもほぼ自動化されているので、使い勝手はGoo!です。
また、使ってないので、ほんとに動くかどうか分からないけど、既存プログラムのダイレクトIOフリー化機能も有るらしい。
古ーいIOをたたくDOSアプリをWindows上で動かせる。
意外と利用価値は高いかも。

電子回路の豆知識 パラレルポート ピン配列など
PortTalk Windows IOポートアクセス用ドライバ
[PR]
by isoq | 2008-08-25 19:19 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Windowsのタスクスケジューラをプログラムから設定する

ITaskScheduler (COM)
NetScheduleJobAdd (Win32)
Win32_ScheduledJob (WMI)

引用:
API が COM で公開されている以上、COM に関する基本的な知識が必要です。
それが無ければ、IDE の力も借りられない状態では手も足も出ません。

ヘルプからだと読み取りにくいかもしれませんが、「参照設定」できない COM オブジェクトは、以下の手順で利用します。

・使用するインターフェースを自分の使う言語用に書き下ろす。
・CoCreateInstance() API により、使用する COM オブジェクトのインスタンスを生成する。
・オブジェクトインスタンスの参照をインターフェースでキャストし、必要なメソッドを呼び出す。


参考ページ:【C#】C#アプリからによるタスク登録の自動化について - Insider.NET



6/17 追加:
CodeGuru: Basic class for using the Microsoft Task Scheduler
やりたい事は、これそのまま。
ちょっと改造すると、分刻みに繰り返し実行も出来るようになる。
キーワード:ITask, IScheduledWorkItem, TASK_TRIGGER structure, ITaskTrigger
[PR]
by isoq | 2008-06-16 18:45 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

マイケル・ペイジさん、正解あってますか?

時差ぼけ
↑にコメントを頂いたのですが、https://go-kaidoku.jp の問題の答えに納得いかなかったので、実際にVC 6.0でテストしてみました。

問題の抜粋:
class A {};
A DoNothing ( A object)
{
return object;
}

main()
{
A object;
DoNothing(object);
}

このコードを実行するとクラスAのオブジェクトは何回コンストラクトされますか?



私の予想は、3回だったのですが、
このサイトの正解は1回だそうです。
(3から初めて、20くらいまで行ってから、2,0,1の順に当てずっぽうして正解を見つけました ^^;)

う~ん、どう考えてもコンストラクタが1回、コピーコンストラクタが最低2回は呼ばれるはず。
(C++の実装次第では、コピーコンストラクタがもっとたくさん呼ばれる可能性もある気がする。)

実際にVCで確認しても、コンストラクタが1回、コピーコンストラクタが2回で、合計3回コンストラクトされました。
なので、「正解は1回」には納得できませんな。

それとも、コピーコンストラクタが呼ばれても、「コピーされた」のであって、「コンストラクトされた」訳ではないということでしょうか?
[PR]
by isoq | 2008-05-16 01:56 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

10番以上のCOM(シリアル)ポートを開く方法

COM通信を行うプログラムで、USB-シリアル変換器を使用するものがあったのですが、
USB-シリアル変換機は、挿入するUSBポートを変えるたびに、新しいCOMポート番号を作成してくれるというきわめて不合理な仕様(Windowsの仕様だと思います)になっているので、いつの間にかCOMポート番号が10以上になってしまうことがあります。

いままで動いていたプログラムが突然動かなくなった。
というレポートが来ました。
COM番号は正しく入力されているようですし、何が原因かわかりませんでした。
ちょっと引っかかったのがCOMの番号でした。
もしかしたら、COMの番号に上限があるのかも、、、

そう思って調べてみると、案の定、ありました。
こちらのページで解説されていました。

これは、Windowsのバグ仕様で、COM10以上のCOMポートを指定するには、
CreateFile(
    "\\\\.\\COM10",  /* 通信デバイスの名前のアドレス */
    fdwAccess,          /* アクセス (読み取りおよび書き込み) モード */
    0,                /* 共有モード */
    NULL,          /* セキュリティ記述子のアドレス */
    OPEN_EXISTING,    /* 作成方法 */
    0,              /* ファイル属性 */
    NULL          /* コピーする属性付きファイルのハンドル */
);

(Microsoft のページから抜粋)

のように、特別な指定方法をしなければいけないそうです。
難儀ですね。
[PR]
by isoq | 2008-03-18 18:04 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

違いが分からん。。。C++おそるべし

デバッグとリリースで挙動が違う。
この手の問題、最近よく遭遇するな~ (^^;)

リリースだと、うまく動かないコード↓


double* pos[3] = {x, y, z};  // xyzはdoubleポインタ
for(int i=0; i<3; i++)
{
     CString strKey;
     strKey.Format("Pos %d", i);
     *pos[i] = um2mm(ini.GetDouble(strKey));
}


um2mmは、ミクロンからmmに変換するインライン関数。
単純に引数を 1000.0 で割って返しているだけ。
ini.GetDouble() は、INIファイル操作クラスのdouble値を取得する関数。
ini内では、挙動が正しいことを確認済み。
だから、おかしいとすると、ここのどこか?
デバッグビルドでは、正しい値が返ってくるんだけど、
リリースだと、xyzの値がすべてNANになってしまう。。。

で、改善後はこちら↓


double* pos[3] = {x, y, z};
for(int i=0; i<3; i++)
{
     CString strKey;
     strKey.Format("Pos %d", i);
     double p = ini.GetDouble(strKey);
     double pp = um2mm(p);
     *pos[i] = pp;
}


いったい何がちがうと言うのだろう???

おそるべし VC の最適化機能。。。

ちなみに、 VC++ 6.0 です。
[PR]
by isoq | 2008-02-12 12:31 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Windows Vistaのドライバ開発について調べ物


とある事情で、Windows Vistaのデバイスドライバの開発方法を調べています。

最初に手に取ったのは、Windows Vista カーネルソフトウェア 開発技法という書籍です。ドライバ開発にDDKを使用することは知っていましたし、MSDNのCD群に含まれていたのも知っていましたが、いままでは自分には関係のない物でした ^^;

DDKには、必要なドキュメントからコンパイラまで含まれています。これ1つでも、ドライバ開発を始められそうだったのですが、やっぱり、膨大なドキュメントに埋もれて出発するのはちょっとつらいので、書籍に頼ることにしました。

とはいえ、まずは、DDKを入手する必要があります。
この書籍では、MSDNで手に入れるか、別途購入すると書いてありましたが、MSDNは現在期限切れで更新していないのでした。。。

MicrosoftのHPを探してみると、無料で配布していることがわかりました。(Windows Driver Kit と Windows Logo Kit について)
Microsoft Connect のサイトに無償登録することで、各種の会員制プログラムを利用可能になります。その中の1つに、DDK(WDK)が含まれています。

とりあえず、ダウンロードを開始したものの、ファイルサイズは2GB超!!!
ダウンロードソフトは、後5時間かかると言っています。
こりゃ、今日は無理だな。。。

今日のところは、書籍で予習しときます。

あと、Microsoftのサイトで、ドライバ開発の参考になりそうなサイトがありました。

Windows Vista のドライバ開発

内容的には、開発手法そのものではなく、各種ドライバ・カーネルソフトウェア開発における注意点や、Windows Vistaの仕様などのドキュメントへのリンクをまとめた物のようです。
基本的な所には目を通しておく必要がありそう。
[PR]
by isoq | 2007-10-27 00:58 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

float の悪夢。。。 3

float の悪夢。。。 2

やはり最適化が原因でした。
最適化のありなしで、次のようにコードが変わります。

--- DEBUG ---
float c = a / (b / 1000.0f);
00411CC9 fld dword ptr [b (42EB44h)]
00411CCF fdiv dword ptr [__real@447a0000 (42A0CCh)]
00411CD5 fdivr dword ptr [a (42EB40h)]
00411CDB fstp dword ptr [c]
00411CDE fld dword ptr [c]
00411CE4 fstp qword ptr [esp]


--- RELEASE ---
float c = a / (b / 1000.0f);
00401019 fld dword ptr [b (40B044h)]
00401022 fmul dword ptr [__real@3a83126f (409100h)]
00401028 fdivr dword ptr [a (40B040h)]
0040102E fstp qword ptr [esp]


うーん、、、
なかなか最適化されていますな。
。。。

結局、#pragma で演算部分だけを別関数にして最適化を無効にする事で解決。

#pragma optimize("", off)
inline float calc(float d, float e)
{
return d / (b / 1000.0f);
}
#pragma optimize("", on)


もっと根本的な解決方法は無いものか。。。
[PR]
by isoq | 2007-09-28 10:42 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

float の悪夢。。。 2

float の悪夢。。。の続き。

再現するコードができました。


float a = 10;
float b = 10;
void CcalcfloatDlg::OnBnClickedOk()
{
FILE* f = fop en ("c:\\debug.txt", "a+");
if(f)
{
#ifdef _DEBUG
fprintf(f, "DEBUG\n");
#else
fprintf(f, "RELEASE\n");
#endif
float c = a / (b / 1000.0f);
fprintf(f, "%f\n", c);
fclose(f);
}
}


ちなみに、a, b をローカル変数にした場合は、問題が出ませんでした。
これの結果は、以下のとおり

RELEASE
999.999953
DEBUG
1000.000000


原因は最適化ですかね?
最適化を無効にすると、DEBUGと同じ結果となります。
困るな~
最適じゃないじゃん。
[PR]
by isoq | 2007-09-27 18:47 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

float の悪夢。。。

float の割り算などをする処理で、
まったく同じ入力を与えているにもかかわらず、DEBUGモードとRELEASEモードで結果が違う。。。
違いはごくわずかですが、違うんです。

DEBUGでは、 0.009999999776482582100...
RELEASEでは、0.010000000474974513000...

0.0000000006 の違いながら、その後の処理に影響しちゃうんですよ。。。

どうなってんだい!プロセッサのバグなのかな。。。

でも、同じ計算を再現性の確認のために作った別のプログラムで動かすと、問題なく、まともな結果を示すんだよね。
環境は、Pentium4 世代の Xeon 3.06GHz。
不思議だ。。。

その後の処理では、この値で数値を割り、結果を整数として利用する予定なので、あまり細かい数値は問題ないのですが、ずばりの境界がDEBUGとRELEASEでずれてしまうので、かなり困ったことになります。

とりあえず、途中結果に 0.001 を足してつじつまを合わせて ^^;

くそー、本当に不可解だ。。。
[PR]
by isoq | 2007-09-27 18:30 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇