Win32API 質問箱 Build8

このエントリーをはてなブックマークに追加
>>951
>>942にも書いてあるがEM_SETTABSTOPS
    ☆ チン  〃  Λ_Λ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ヽ ___\(\・∀・) <  MIDIプレーヤーまだー?
          \_/⊂ ⊂_ )   \_____________
>>948
__try〜__exceptで囲むとか。
Win2000でエラーが出ないのは単にロードに失敗してるだけだと思うぞ
(NT系ではexeはリソース取得の目的でしかロードできない)
>>953
>NT系ではexeはリソース取得の目的でしかロードできない
じゃあGetProcAddrを呼び出すまでは合法では?
>>953
例外ハンドラも試してみましたがハンドラが呼ばれませんでした。
__try{
FreeLibrary(hINST); // ここでエラー
}__except(EXCEPTION_EXECUTE_HANDLER){
// 呼ばれない
}

また、Win2000では
HINSTANCE hINST = LoadLibrary("fontview.exe");
if(hINST != NULL){
// デバッグしたところこのブロックに入ることを確認済み
FreeLibrary(hINST);
}
としているのでロードはできていると思います。
用途が限定されるがLoadLibraryExを使うという手もある

【不幸のレス】

このレスを見た人間は十三日以内に死にます。

※あなたに訪れる死を回避する方法が一つだけあります。
それはこのコピペを一時間以内に7つ、別のスレに貼り付ける事です
↓これの TCHAR バージョンは有りますか?
wctomb(char *, wchar_t);
wcstombs(char *, const wchar_t *, size_t);

こういう感じで。
_tctomb(char *, TCHAR);
_tcstombs(char *, const TCHAR *, size_t);

もしも無くて良い代物でしたら代替案を御教授下さい
>>956
それだとGetProcAddressできないんで・・・
>>958
WideCharToMultiByte
>>960
WideCharToMultiByte に TCHAR を渡しても大丈夫なのでしょうか。
wchar_t ではなく char のとき困るような気がします。
(↑もちろんこの時は無変換です)

int WideCharToMultiByte(
UINT CodePage, // コードページ
DWORD dwFlags, // 処理速度とマッピング方法を決定するフラグ
LPCWSTR lpWideCharStr, // ワイド文字列のアドレス
int cchWideChar, // ワイド文字列の文字数
LPSTR lpMultiByteStr, // 新しい文字列を受け取るバッファのアドレス
int cchMultiByte, // 新しい文字列を受け取るバッファのサイズ
LPCSTR lpDefaultChar, // マップできない文字の既定値のアドレス
LPBOOL lpUsedDefaultChar // 既定の文字を使ったときにセットするフラグのアドレス
);


何に使うかといいますと、今回は std::fstream のファイル名指定に
char、wchar_t の両方が渡されても大丈夫という関数なのです。
↓こんな感じです。

void FileOpen( LPCTSTR filename )
{
char buffer[MAX_PATH];
_tcstomb( buffer, filename, MAX_PATH );
std::ofstream ofs( buffer );
.........
}
>>958
TCHAR == char の環境だと、そもそも文字コード変換の意味がないと思うが…
(単なるコピーだよな)
>>962
その単なるコピーになる時と、wide->multi 変換が必要な時で同じコードを共有したいのです。
そもそもTCHAR自体_UNICODEマクロと_MBSマクロでコンパイル時に切り替えているだけなんだが

自分で
_tctomb(char *, TCHAR);
_tcstombs(char *, const TCHAR *, size_t);
を作ってその中でマクロでコードの切り換えするのが普通じゃ?
>>964
_MBCS でコードしたい時と _UNICODE でコードしたい時で
同じ関数を使えたら資源の有効利用になると考えました。
>>963
FileOpen() の内部で #ifdef で切り分ければ?

もちろん _tcstomb() 自体を #ifdef _UNICODE で切り替えることも可能だが、
ムダに文字列コピーが発生するからお奨めはしない。
同じ関数ですか。
>>966
自分で#ifdefとか使って切り替えれば?
その部分だけを別ファイルなりにしておけば、本体のコード自体は見かけ上変わらない。
970デフォルトの名無しさん:03/02/08 23:03
デタッチされないDLLを作るにはどうしたら良いですか?

いま、DLLの中でスレッドを起動しているのですが、

放っておくと「DLLがデタッチされてしまうがスレッドが動いている」という状態になって

ハングしてしまいます。

スレッドは動かしつづけたいのでDLLがデタッチされないようにしたいのですが。
自分をLoadLibraryすればいいんじゃない
>971
ありがとうございます。やってみたら望んだ通りになりました。
973958:03/02/08 23:51
マクロで何とかしようと思います。アドバイスを戴きまして、
まことに有難う御座いました。
mallocとGlobalAllocの違いって何?
>>974
mallocっへ内部的にはHeapAllocだっけ?
>>975
処理系(というかランタイム)依存

mallocは一般的にはVirtualAlloc等で確保した大きなブロックをランタイムライブラリがさらに分割管理している。
HeapAllocはmallocとほぼ同じようなことをシステム側がやってくれる。mallocと比べて速度が少々劣る可能性が高い。
GlobalAllocは大きなブロックをそのままうけとる。Win16との互換性の関係で少々余分な処理が入る。

小さい領域を頻繁に確保、開放したい場合はmalloc
確保領域をグループ化して一気に開放したい場合はHeapCreate->HeapAlloc->HeapDestroy
HGLOBALを要求するAPIを使いたい場合はGlobalAlloc
仮想メモリ空間を厳密に管理したい場合はVirtualAlloc
977デフォルトの名無しさん:03/02/09 16:51
>>931
>CFSTR_FILECONTENTSをどうやって引き渡すのか分かりません。
IStream を使うという話ではないの?

>ClipSpyで見てもCFSTR_FILECONTENTSは<Data unavailable>になっていて、
IStreamを使っている(遅延される)から表示のしようがないだけでしょう。
978デフォルトの名無しさん:03/02/09 16:56
> スレッドは動かしつづけたいのでDLLがデタッチされないようにしたいのですが。
そんなことしてたら、下手するとゾンビるぞ。 >>970



・・・ちゃんと忠告したからな。あとは知らんぞ。
FreeLibraryAndExitThreadだな
976より975の方がわかってるな
だいいちVirtualAllocは「厳密」などという曖昧な理由では使わない
974よ,それは例えばGMEM_MOVEABLEだ
981名無し@沢村:03/02/09 20:20
>>952
タブを設定しようと思い、SendMessage(hEdit,EM_SETTABSTOPS,1,1);としたところプログラム開始エラーが出てしまいました。
SendMessage(hEdit,EM_SETTABSTOPS,1,1);をSendMessage(hEdit,EM_SETTABSTOPS,0,1);に直すとエラーは出ないので、3番目の引数がくせものと思うのだが、
EM_SETTABSTOPSの使い方を教えてはくだされんか〜♪


ヘルプも読まない主義かよ
>>982
読みません。
知りません。
>>983
死のうか。 
985名無し@沢村:03/02/09 21:48
皆々様方〜EM_SETTABSTOPSの使い方がわかったぞよ〜♪
最初SendMessage(hEdit,EM_SETTABSTOPS,1,1);としたところエラーが出たのでビックリしたが、
その後の調べでは、4番目の引数にエラーの原因があったのよ。
4番目の引数をDWORD型にしてその後int型にキャストしなおすとちゃんとなることがわかったのよ。
皆々様方〜これは私にとって1大発見であるのだよ!!!
986名無し@沢村:03/02/09 21:54
皆々様方〜、タブの幅の設定の仕方はわかったが、これはタブキーをうったとき、
その間隔でタブが出るのだが、普通に文字をうって、その列にきたとき自然にタブが挿入されるようにするにはどうすればいい?
皆々様方〜教えてくだされ〜♪
987名無し@沢村:03/02/09 21:57
つまりあらかじめ列にタブを設定しておいて文字がその列になったとき、
自然にタブの間隔があくようにするということだが、どうすればいいですかな?
皆々様方〜教えてくだされ〜♪
いかん. . .
誰だ本物の沢村を召還したのは
意図がイマイチ汲み取れないが、例えばスペース4つをタブに置換したいということか…?
とりあえず放置せよとの命令が下った。
次スレはどこ?
次スレ
Win32 Aplicationプログラミング
http://pc2.2ch.net/test/read.cgi/tech/1044267746/
【MS自ら】APIの正しい使い方教えろ【ガセネタ】
http://pc2.2ch.net/test/read.cgi/tech/1044378059/
993デフォルトの名無しさん:03/02/10 00:29
>沢村
ゲーム製作技術板を荒らすな
Windows Programing for C/C++(Not MFC)
http://pc2.2ch.net/test/read.cgi/tech/1018239290/l50
995デフォルトの名無しさん:03/02/10 12:22
オレも FB1.02 だけど問題ないけど。(Win2000)
エラーが出たときのSQLステートメントは?
とりあえず isql で以下でテストしてみるとか。
 select extract(year from cast('now' as date)) from rdb$database;
996デフォルトの名無しさん:03/02/10 12:23
って前に同じ発言が…… 逝ったきます。

あと、できれば他の言語でも開発できるようにインタフェースを公開して欲しいっす。
997デフォルトの名無しさん:03/02/10 12:24
確率と確立を区別できない坊が多いな。
あと定跡と定石
それと香具師と家具師
998デフォルトの名無しさん:03/02/10 12:26
じゃ「ばばぬき」キボンヌ
999602 ◆hOJBbTlYfs :03/02/10 12:27
RebarRebarリバニタ炒め。
おいちー。

BYE!
999で止まるスレってのもスゴイね。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。