■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

VisualC++相談室 5
251 名前:247 :01/12/06 17:00
どうしようもない間抜けっぽいので教えてやる。

カレントディレクトリのiniファイルを見に行け。
デバッグ時もリリース時も作業用のディレクトリを
ソースと同じディレクトリ(かテスト環境用のディレクトリ)に
しておけ。

iniファイルは一つで済む。

VBのApp.Pathみたいのを期待しているようだが、
「実行モジュールと同じディレクトリのiniファイル」を見に行くのは
VB厨のやり方だ。

252 名前:デフォルトの名無しさん :01/12/06 17:08
>>249
> 質問読んでそれぐらいの認識もできない?
煽るな。

俺には書き方が悪いようにしか見えん。何をやりたくて、何を避けたいのかのトレードオフが
分からんぞ。

1 exe と ini ファイルを「常に同じ」ディレクトリに置きたい
2 ini ファイルを複数用意するのは嫌だ

ってのが前提条件なら、そりゃ exe を同一ディレクトリに置くしかないだろ。状況によっては
1 を譲歩して良いが 2 は譲歩できん、ということなら、「状況」と「譲歩」について、詰めて書
け。それはキミにしか判断できないことだ。

#書いてないけど、exe のフルパスを取得する方法はわかってるよね?

253 名前:デフォルトの名無しさん :01/12/06 18:54
>>251
現在の状況はそうなっている。

>>252
確かに書き方が悪かったのは認める。

1 ユーザーの環境では常にiniファイルをexeと同じディレクトリに置きたい。だが
2 開発中の環境ではソースが置いてあるディレクトリにiniを置いて
 ReleaseとDebugのexeで共通に読み込みたい。

exeの置いてあるディレクトリに置くのは>>228で教えてもらった
GetModuleFileName()を使えばできる。が、これでは 2 が解決しない。

カレントディレクトリに置くようにすれば同時に解決するが
"C:\" とかのルートディレクトリレクトにインストールされると
通常、"C:\Program Files\foo" とかにインストールされた場合と
異なり、最後に "\" がつくので特殊な処理がいる。
ルートだけ処理を加えればいいが、日本語のディレクトリや
ネットワークにインストールされた場合、矛盾しない処理方法が分からない。

254 名前:デフォルトの名無しさん :01/12/06 18:57
かれんとならディレクトリ名の処理は必要なかろうに...

255 名前:デフォルトの名無しさん :01/12/06 19:05
>>254
ディレクトリ名つけずにファイル名だけで open すれば飯竹だよね。謎だ。

>>253
> 開発中の環境
これとユーザの環境の区別を、どうつける? 俺が考えつくのは、

1. インストール時にインストーラで特定の値をレジストリに書き込む
2. その値が書いてあればユーザ環境、なければ開発環境と見なす

とか、

1. 開発環境にはカレントディレクトリに特定のファイルを置いておく
2. そのファイルが存在すれば開発環境、しなければユーザ環境

ってところだが、いずれにせよマーフィーの法則により

1. 開発環境では問題が出ない
2. ユーザに渡した主観、ユーザ環境でのみ使うコードにバグが見つかる

ことが保証されているから、やめたほうが良いと思う。

256 名前:デフォルトの名無しさん :01/12/06 19:06
ユーザーが途中でファイルを開いて読み行くとカレントは変わってしまうので
プログラムの起動時のカレントを記憶している。

257 名前:デフォルトの名無しさん :01/12/06 19:09
かれんとを元の位置に戻せよ。
おもしろいな、お前のプログラム

258 名前:デフォルトの名無しさん :01/12/06 19:47
>>257
なるほど・・・。
ファイル処理の後に全部戻せばいいのか。
だがそれだと、深い所に保存したファイルに何度もユーザーが触る時に不便だろう。

ただ、Win2000あたりからアプリが前回の最後のディレクトリを覚える仕様に
変わった?のでよく分からんのだけど。
余談だがVC++ではプロジェクトを切り替えてもディレクトリが前回のプロジェクトのまま、
とかなって不便なのだが。

259 名前:デフォルトの名無しさん :01/12/06 20:02
いや、やっぱりフルパスでのディレクトリの処理をする必要がある。
ファイルのオープン中にも画面の書き換えが発生すると
所定の位置のデータベースを読みに行く仕様なので。

260 名前:デフォルトの名無しさん :01/12/06 20:07
つかなんで開発中にReleaseとDebugのiniを同じにすんの?
開発中はDebugだけでテストすりゃいいんじゃ?

261 名前:デフォルトの名無しさん :01/12/06 20:10
>>260
速度が違いで発生するバグとかに対処するため普段はReleaseで動かしてる。
Debugは問題が発生した時の追跡のみに使用。

262 名前:デフォルトの名無しさん :01/12/06 20:13
放置しても(・∀・)イイ?

263 名前:デフォルトの名無しさん :01/12/06 20:15
確かに我ながらうざいな。消えるわ、荒らして悪かったな。

264 名前:デフォルトの名無しさん :01/12/06 20:17
とりあえずbuild_path()とかなんとか関数つくっとけ。
で、カレントディレクトリはころころ変えるな。

265 名前:デフォルトの名無しさん :01/12/06 21:14
>>263
初めていいこと言った

266 名前:デフォルトの名無しさん :01/12/06 22:07
☆WinXPに新しく追加されたAPI☆

267 名前:デフォルトの名無しさん :01/12/06 22:11
↓のプログラムはウインドウを表示するプログラムなおですが、どこが悪いのかわりません
どこが悪いのでしょうか?

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hWnd;
MSG message;
WNDCLASSEX wc;

wc.hInstance = hInstance;
wc.lpszClassName = "DDraw";
wc.lpfnWndProc = WndProc;
wc.cbSize = sizeof(WNDCLASS);
wc.style = 0;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.lpszMenuName = NULL;

if(!RegisterClassEx(&wc))
return 0;

hWnd = CreateWindow(
"DDraw",
"DirectDraw",
WS_OVERLAPPEDWINDOW,
300,
200,
200,
200,
HWND_DESKTOP,
NULL,
hInstance,
NULL);


ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);

while(GetMessage(&message, NULL, 0, 0)){
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}

268 名前:デフォルトの名無しさん :01/12/06 22:11
続き

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

269 名前:デフォルトの名無しさん :01/12/06 22:17
>267
エラーを報告白やヴォケ
俺の予想としてはHWND_DESKTOPって何打?ってかんじ。ペアレントがなぜペアレントを持つのかってかんじ。

270 名前:デフォルトの名無しさん :01/12/06 22:27
っていうか、プリプロセッサ使えば一発な気が・・・
win32_debugとかwin32_nodebugとかあるし
自分で作って設定してもいいし・・・

271 名前:デフォルトの名無しさん :01/12/06 22:50
>>267
RegisterClassEx() に失敗してるやん。return 0 で終わらせずに MessageBox()
でエラーメッセージぐらい表示しとけよ。

WNDCLASSEX 使うなら wc.cbSize のサイズが間違ってる。

272 名前:デフォルトの名無しさん :01/12/06 23:05
int PASCAL WinMain(hInstance,hPrevInstance,lpszCmdLine,cmdShow)
ってなってるんですけど
PASCALってなんですか?

273 名前:デフォルトの名無しさん :01/12/06 23:08
win*.hを検索して見ろ

274 名前:Kusakabe Youichi :01/12/06 23:11
In article >>272, デフォルトの名無しさん/272 wrote:

> int PASCAL WinMain(hInstance,hPrevInstance,lpszCmdLine,cmdShow)
> ってなってるんですけど
> PASCALってなんですか?

マニュアルに書いてありますよ。(ちゃんと買ったものなら)

275 名前:デフォルトの名無しさん :01/12/06 23:12
マニュアル読んでも意味が分からない、に一票

276 名前:てんさいぷろぐらむぁ(偽) ◆8Fck5JHo :01/12/06 23:30
>>267

1:WNDCLASSEXのcbSizeが間違ってる。
sizeof(WNDCLASS)は間違い。
sizeof(WNDCLASSEX) か sizeof(wc)に変更

2:hIconSmが設定されていない。
WNDCLASSにはないけどWNDCLASSEXにはhIconSmがある。
現在のやり方では構造体の初期化をしているわけではないので、大変イケナイ値が入っている。

>>269
HWND_DESKTOPはNULLで定義されていたような。
デスクトップを親にもつウインドウ(トップレベルウインドウ)のような抽象化をする為に
HWND_DESKTOPがあるものだと思っているのですが・・・

277 名前:269 :01/12/06 23:36
>276
初耳。ありがとう。

278 名前:デフォルトの名無しさん :01/12/06 23:53
>>272
MSDN Library 引きましょう。

今は PASCAL は obsolete だから WINAPI を使うのが推奨されてるけど。

279 名前:267 :01/12/07 00:09
いろいろなレスありがとうございました。
なんとか解決できました。

280 名前:デフォルトの名無しさん :01/12/07 02:04
っていうか、iniファイルを複数作りたくないなら、win.iniかレジストリ使うのが
普通だと思うが。もし箱売りのソフトならレジストリ使わないとWindowsロゴ取得で
ひっかからないか?
ReleaseとDebugを同じディレクトリにするのがスマートじゃないとか言ってるけど、
その根拠も示されてないし。なんか、ただのわがままにしか見えない。
そもそもGetModuleFileNameを知らなかったり、パス解析で悩むようなレベルだから
仕方ないのかもしれないが。あと質問してるくせに偉そうだし。レベル低いくせに。

_splitpathを面倒とか言ってたけど、このスレに書くために押したキーの回数よりも
ソースに_splitpathを追加する方がよっぽど少ないと思うが。

マルチ言語化とか考えてるなら、パス解析はAPIのパス関数を利用するのが一番安全。
ただしWin98以降限定になってしまうが。
調子に乗ってマルチ言語化してると台湾あたりから中国語でお礼とかバグ報告が来る
危険も伴なう諸刃の(以下略)。っていうか読めないっつーの。しかも中国人の書い
た下手な英語は中国語よりもわけ分からん。

281 名前:デフォルトの名無しさん :01/12/07 02:06
知らない間に韓国語版が出てたりしてアゼーン

282 名前:デフォルトの名無しさん :01/12/07 02:09
>>280
まぁまぁ。死体に鞭打ちうつなって。

283 名前:デフォルトの名無しさん :01/12/07 18:47
すいません、間違えてその4に書いてしまったのでもう一回書いちゃいます。

シリアル通信で、DCB構造体のfAbortOnErrorをTRUEにしても
エラーのときに処理を中断しないんです(FALSEと変わらない)。
Win2000だと設定通り動くんだけどWin98でやったらこうなってしまいます。

同じような人いませんか?どっちでもいいんだけどなんか気持ち悪いです。

284 名前:デフォルトの名無しさん :01/12/07 18:57
VC++6.0で質問です。

指定したファイルをZIPファイルに圧縮するプログラムを作りたいんですけど
zip32.dll、Unzip.dllをロードするのはわかるけど、肝心の関数がどういうもの
か?
GetProcAddress()で何を呼び出せばいいかわからない。

サンプルがあれば誰か教えてください。

285 名前:デフォルトの名無しさん :01/12/07 19:07
>>284
ライブラリやヘッダ付いてなかった?

286 名前:デフォルトの名無しさん :01/12/07 19:22
今見てきたら、開発用は別に配ってるのね。
それ落とすべし。

287 名前:デフォルトの名無しさん :01/12/07 19:29
>>285

libファイルはありますがhファイルが無し。(それで困ってる)
DLLだけでもLoadlibrary()を使えばOKと思いますから。

288 名前:デフォルトの名無しさん :01/12/07 19:41
>>287
ん?ちゃんと付いてたぞ。

289 名前:デフォルトの名無しさん :01/12/07 21:36
ちょっと質問
for (int i = 0; i < 5; ++i);
for (int i = 0; i < 5; ++i);
これがコンパイルできないんですけど普通ですか?

290 名前:デフォルトの名無しさん :01/12/07 21:37
#define for if (0) ; else for

FAQだ

291 名前:デフォルトの名無しさん :01/12/07 21:49
>>289
i の2重定義ですな。 フツーフツー。

292 名前:デフォルトの名無しさん :01/12/07 22:44
現在VC6って、サービスパックいくつまで出てるんでしょう?
今3があたっていますが、これって古いですか?

293 名前:デフォルトの名無しさん :01/12/07 22:45
SP6

294 名前:デフォルトの名無しさん :01/12/07 22:54
サービスパックって、いつまででるの?

295 名前:デフォルトの名無しさん :01/12/07 22:57
誰も知りません

296 名前:284 :01/12/08 09:22
>>288

どこのWebか教えてください。

297 名前:デフォルトの名無しさん :01/12/08 11:22
MFCで CHtmlView を使っているんですが
例外処理 (初回) は ***.exe (KERNEL32.DLL) にあります: 0xC0000005: Access Violation。
というメッセージがいっぱい出ます。
これってこういうものなんですか?
特別なことはしてないつもりですが CHtmlView が例外出しまくりです。

それと表示しているHTMLのリンクをクリックするとブラウザが起動してしまいます。
CHtmlView 内に表示したいんですがどうしたらいいですか?

298 名前:デフォルトの名無しさん :01/12/08 11:32
べつにいいんでないの?

299 名前:デフォルトの名無しさん :01/12/08 13:29
CString型からchar型に変換するにはどうすればいいですか?

300 名前:デフォルトの名無しさん :01/12/08 13:34
一文字目だけでいいな
CString str = "aaaa";
char c = str[0];

301 名前:299 :01/12/08 15:25
>>300
どもありがとうございました

302 名前:デフォルトの名無しさん :01/12/08 15:40
>>299
CString str = "AAAA";
char *s = (LPTSTR)(LPCSTR)str;

303 名前:デフォルトの名無しさん :01/12/08 15:43
汎用キャラクタマッピングをよく知らない人はキャストにLPTSTRは使っちゃいけません。

304 名前:syosinsya :01/12/08 17:07
Midi再生をしようと思って、
MCI_OPEN_PARMS open;
MCI_PLAY_PARMS play;
open.lpstrDeviceType = "Sequencer";
open.lpstrElementName = name;
mciSendCommand(0, MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, ( DWORD )&open );
mciSendCommand(open.wDeviceID,MCI_PLAY,MCI_NOTIFY,( DWORD )&play );
のようにして再生できたのですが、連続再生がうまくいきません。
色々調べてみたところ、メッセージが送られたら、MCI_SEEKで戻す、というようにすればいいとのことでしたが、
その、MCI_SEEKで戻す、というのの具体的方法がわかりません。

上記のようなソースを元に関数化したいと思っているのですが、毎回呼び出される事に、はじめから再生するようにするにはどうすればいいのでしょう?

305 名前:( _ 。。) _ バタ。 :01/12/08 21:10
>>303
#define LPTSTR unsigned short*
って安直な考えはしちゃいけなかったのか…(汗)

>>304
MM_MCINOTIFY のメッセージをトラップして
mciSendCommand(open,MCI_SEEK,MCI_SEEK_TO_START,(DWORD)&prm);
で先頭に戻してもっかいPlayを叩き込んで終りです。

あ。念の為にSEEK前にStop噛ました方が良いかな?

306 名前:305(ミス修正) :01/12/08 21:12
mciSendCommand(open,MCI_SEEK,MCI_SEEK_TO_START,(DWORD)&play);
かな? 304さんの定義を使うとこうですな。                ~~~~~~

307 名前:デフォルトの名無しさん :01/12/08 23:19
GetBuffer()

308 名前:デフォルトの名無しさん :01/12/09 20:12
マウスエミュレーターみたいなのを作りたいのですが
(キーボードのスペースを押すとクリックになるみたいなやつ)
全然方針が立ちません。
情報持っている方がいらしたら、是非教えてください。

309 名前:デフォルトの名無しさん :01/12/09 20:13
mouse_event

310 名前:デフォルトの名無しさん :01/12/09 20:17
他のウインドウに対してマウスイベントを送る事なんて
できるんですか?

311 名前:デフォルトの名無しさん :01/12/09 20:18
余裕

312 名前:デフォルトの名無しさん :01/12/09 20:21
くそめしまえだぜ

313 名前:デフォルトの名無しさん :01/12/09 20:35
Windows NT/2000:この関数は、SendInput 関数にとって代わられました。SendInput 関数を使ってください
となっていますが、98ではSendInput使っても動かないんですよね?

314 名前:デフォルトの名無しさん :01/12/09 20:36
SendInputのInput構造体の説明もなかったし・・・

315 名前:デフォルトの名無しさん :01/12/09 21:59
Windows2000 のOSの勉強したいのだが、
C++で実装して説明している書籍教えて

316 名前:デフォルトの名無しさん :01/12/09 22:07
何いってのかわからんけどSDK読め

317 名前:( _ 。。) _ バタ。 :01/12/09 22:52
>>313
MSDN読むべし、SendInputの項目、最後の方に
Windows NT/2000:Windows NT 4.0 SP3 以降
Windows:Windows 98
ヘッダー:winuser.h 内で宣言
インポートライブラリ:user32.lib を使用

<< http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_sendinput.htm >>

>>314
INPUT as;
as.hi.uMsg;
as.hi.wParamH;
as.hi.wParamL;
as.ki.dwExtraInfo;
as.ki.dwFlags;
as.ki.time;
as.ki.wScan;
as.ki.wVk;
as.mi.dwExtraInfo;
as.mi.dwFlags;
as.mi.dx;
as.mi.dy;
as.mi.mouseData;
as.mi.time;
as.type

とりあえず、全部列挙してみたが…割り込ませるイベントの内容を記述するらしいな。
#KeyIvent / MouseIvent / じゃあ、hiって何のイベントだろ…(汗

318 名前:デフォルトの名無しさん :01/12/09 22:54
>>315
お前はホントにWindows2000の"OSの勉強"がしたいのかと問いたい。
問い詰めたい。小一時間、問い詰めたい。

319 名前:デフォルトの名無しさん :01/12/09 23:40
>>315
「Windows2000 アーキテクチャ徹底解説」

Windows2000 の実装まはやってないけど。

320 名前:デフォルトの名無しさん :01/12/10 01:27
ボーランドのCPPとマイクロソフトのCPPってどっちがよいの?

321 名前:デフォルトの名無しさん :01/12/10 01:56
>>320
CPPって、プリプロセッサの話?
ANSI準拠してれば、どっちがどうとかってあんまり関係ないような気が。
処理系依存部分の優劣が問いたいのだろうか。

322 名前:デフォルトの名無しさん :01/12/10 02:01
いやいや、マイクロソフトにはヴィジュアルC++。ボーランドにはC++builderが
あるじゃないですか?買うならどっちかなって。
基本的にどちらが優れているか知りたいです。

323 名前:デフォルトの名無しさん :01/12/10 02:06
>>322
判断基準が示されていないので、判断しようがありません。

「金閣寺と東京都庁があるじゃないですか? 観光するならどっちかって?」
知るかよ。

324 名前:デフォルトの名無しさん :01/12/10 02:20
>基本的にどちらが優れているか知りたいです。
Rubyに決まっているだろっ!

325 名前:デフォルトの名無しさん :01/12/10 04:26
>>324
C言語を#execしろYO!
#最近、セキュリティーの関係上 ダメなサーバー多いけどさ

326 名前:デフォルトの名無しさん :01/12/10 04:49
つまらない質問で恐縮ですが、実行ファイルのアイコンに
何らかのファイルがドラッグ&ドロップされたとき、
それを無視して別のファイルを開きたい場合に
どうしていいか判りません。つまり以下のようにすると、

#include <windows.h>
#include <cstdio>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, int nCmdShow)
{
 MessageBox(0,lpCmdLine,"コマンドライン引数",MB_OK);

 if(FILE *fp=fopen("./hoge.txt","r")) {
   fclose(fp);
   MessageBox(0,"ファイルの読み込みに成功しました.","OK",MB_OK);
 } else {
   MessageBox(0,"ファイルの読み込みに失敗しました.","ERROR",MB_OK);
 }
 return 0;
}

単体で起動すれば普通にhoge.txtを開いてくれるのですが、
何らかのファイルがドラッグ&ドロップされた場合、
つまりコマンドライン引数が存在する場合はhoge.txtを開いてくれません。
どなたか知恵を下さい。

327 名前:デフォルトの名無しさん :01/12/10 06:56
>>326
てきとーにSetCurrentDirectoryしろ。

328 名前:326 :01/12/10 08:27
>>327
ありがとう。
とりあえずSetCurrentDirectoryで検索してみます。

329 名前:デフォルトの名無しさん :01/12/10 12:39
>>326
アプリケーションが起動されたときのカレントディレクトリ=.exeのある
ディレクトリだと勘違いしてない?

330 名前:326 :01/12/10 13:42
>>329
さっきそうではないということと、
GetModuleFileName()なるものの存在を知りました。
てきとーにSetCurrentDirectoryを試み中です。

331 名前:326 :01/12/10 14:35
うまくいきません。
下のようにしてカレントディレクトリのセットは出来たのですが、
相変わらず何らかのファイルをドラッグ&ドロップして起動すると
hoge.txtが開いてくれません。更なる知恵を・・・。

 char mpath[1024]; // 実行ファイルのパス名を入れるバッファ
 GetModuleFileName(0,mpath,1024); // 実行ファイル名混みのパス名を取得
 // パス名の後ろからサーチして最初の\まで(つまり実行ファイル名)を削除
 int i = strlen(mp)-1; while (mp[i]!='\\') --i; mp[i] = '\0';
 SetCurrentDirectory(mpath);

 if(FILE *fp=fopen("./hoge.txt","r")) {
   fclose(fp);
   MessageBox(0,"ファイルの読み込みに成功しました.","OK",MB_OK);
 } else {
   MessageBox(0,"ファイルの読み込みに失敗しました.","ERROR",MB_OK);
 }

332 名前:デフォルトの名無しさん :01/12/10 14:40
hoge.txtをフルパスで指定するのがベスト。
_splitpath()でGetModuleFileName()の結果を分解して、_makepath()で結合
しなおすのが良いかと。

333 名前:326 :01/12/10 15:26
>>332
どうもです。

char c_mp[1024];             // 実行ファイル名混みのパス名を入れるバッファ
GetModuleFileName(0,c_mp,1024);   // 実行ファイル名混みのパス名を取得
string mpath = c_mp;           // とりあえずstringに。
s.erase(mpath.rfind('\\'));        // おしりから\を探してそれ以降(つまり実行ファイル名)を削除
string readfile = mpath+"/hoge.txt"; // うぉんちゅう。

で出来ました。ありがと〜。
とりあえずファイルをドラッグした場合はカレントディレクトリが変わるということと、
ファイル操作には絶対パスが必要なときがあるということを勉強しました。m_ _m

334 名前:デフォルトの名無しさん :01/12/10 17:36
おしりから\を消すのは問題あるよ。「表」とかは2バイト目が\だよ。

335 名前:味噌醤油醸造株式会社 :01/12/10 17:43
>>334
1.自分自身の.EXEファイルの名前には漢字を使わない。
2.漢字のファイル名にrenameされたときはあきらめる
ということでいかがでしょうか.

336 名前:デフォルトの名無しさん :01/12/10 17:45
>>335
そんな運任せなんて……

337 名前:326 :01/12/10 17:48
>>334
そうかぁ。でもそれを考え出すととても面倒そうなので
いずれまた考えることにします。
# VisualC++の相談というかWindows上でのCの相談でした。
# すみませんです。

338 名前:デフォルトの名無しさん :01/12/10 18:03
>>337
おいおい。このぐらいで手を抜くなよ...

1 あたまから \ を探していって(ただし _ismblead() を使ってマルチバイト文字の一バイト目なら飛ばす)、
 一番最後の \ を見つける。
2 UNICODE 化してしまう。string ではなく wstring を使えば、悩まなくて良い。

とか、いくらでも手はあるぞ。

339 名前:326 :01/12/10 19:35
>>338
wstringの使い方がまだよく判っていないのと
_ismblead()がcygwinで見つけられなかったので
_splitpathを使ってみました。表表.exeみたいな実行ファイルでも
うまくいってるみたいです。

char c_mp;
char c_drive[3], c_dir[256], c_file[256], c_ext[256];
_splitpath(c_mp, c_drive, c_dir, c_file, c_ext);
string mpath = c_drive;          // とりあえずstringに。
mpath += c_dir;              // ディレクトリ名を付けて
string readfile = mpath+"/hoge.txt"; // 出来上がり

340 名前:デフォルトの名無しさん :01/12/10 19:40
メニューに使われているフォントと同じフォントを使用したい場合どうしたらいいですか?
GetStockObject(SYSTEM_FONT) で取得したフォントはどういうわけかサイズがあいません。
かなり大きめのフォントが返ってきます。
教えてちょんまげ!

341 名前:デフォルトの名無しさん :01/12/10 21:56
>>292
SP5が正解。

342 名前:味噌醤油醸造株式会社 :01/12/10 22:02
>>340
メニューのフォントって、MS UIゴシックじゃなかった?
(自信無し)

343 名前:デフォルトの名無しさん :01/12/10 22:07
>>340
Getパラメーターイんふぉ(なんとか)って関数で取得できた気がするが。
MSDN参照

344 名前:デフォルトの名無しさん :01/12/10 22:19
質問。基本的なことで申し訳ないんだが、
CMyViewクラスのメンバ変数とか外部変数を
他のクラスで呼び出したり、値を代入するには
どうすればいいのでしょうか?
 逆は出来るんだけど・・・

345 名前:ppp :01/12/10 22:22
ええとVC6について質問ですがモノクロのBMPを配列に格納する方法ですが、
C言語の本に


/*--- BitmapToRgb --- 画像変換(Bitmap画像からRGB画像へ)----------------------
hBitmap: 入力Bitmap画像
pr: 出力R画像
pg: 出力G画像
pb: 出力B画像
-----------------------------------------------------------------------------*/
void BitmapToRgb(HBITMAP hBitmap, unsigned char pr[120][160],
unsigned char pg[120][160], unsigned char pb[120][160])
{
HANDLE hDB;
unsigned char *pdr, *pdg, *pdb, *ps, *ps0;
LONG i;

pdr = (unsigned char *)pr; pdg = (unsigned char *)pg;
pdb = (unsigned char *)pb;
hDB=GlobalAlloc(GMEM_MOVEABLE, (DWORD)160*120*4);
ps = ps0 = GlobalLock(hDB);
GlobalLock(hBitmap);

if (bitspixel == 16) { /* 16ビット/画素のフレームメモリ */
GetBitmapBits(hBitmap, (DWORD)160*120*2, ps0);
for (i = 0; i < (DWORD)160*120; i++) {
/* GGGBBBBB RRRRRGGG G成分が6ビット */
*pdb++ = (*ps << 3) & 0xf8;
*pdg = (*ps++ >> 3) & 0x1c;
*pdg++ = *pdg | ((*ps << 5) & 0xe0);
*pdr++ = *ps++ & 0xf8;
/* GGGBBBBB *RRRRRGG G成分が5ビット
*pdb++ = (*ps << 3) & 0xf8;
*pdg = (*ps++ >> 2) & 0x38;
*pdg++ = *pdg | ((*ps << 6) & 0xc0);
*pdr++ = (*ps++ << 1) & 0xf8;
*/
}
}
else if (bitspixel == 24) { /* 24ビット/画素のフレームメモリ */
GetBitmapBits(hBitmap, (DWORD)160*120*3, ps0);
for (i = 0; i < (DWORD)160*120; i++) {
*pdb++ = *ps++; *pdg++ = *ps++; *pdr++ = *ps++;
}
}
else if (bitspixel == 32) { /* 32ビット/画素のフレームメモリ */
GetBitmapBits(hBitmap, (DWORD)160*120*4, ps0);
for (i = 0; i < (DWORD)160*120; i++) {
*pdb++ = *ps++; *pdg++ = *ps++; *pdr++ = *ps++; *ps++;
}
}
GlobalUnlock(hBitmap);
GlobalUnlock(hDB);
GlobalFree(hDB);
}

346 名前:ppp :01/12/10 22:25
上のように乗っていたのですが、
これをボタンに割り当ててメッセージハンドらのコードに加えると
ローカル変数の定義がおかしいと出るのですがどのように変更すればいいのでしょうか?

347 名前:デフォルトの名無しさん :01/12/10 22:28
>>344
まずC++の勉強から始めれ

348 名前:デフォルトの名無しさん :01/12/10 22:41
>>343
NONCLIENTMETRICS ncm;

ZeroMemory(&ncm, sizeof(NONCLIENTMETRICS));
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);

で ncm.lfMenuFont を見ればわかると思う。

349 名前:デフォルトの名無しさん :01/12/10 23:13
リソースタブのdialogの項目をクリックしてダイアログボックスを
作成したのですが、誤ってコントロールパレットを消してしまい
新しくボタンを追加したりできないので、再び表示させる方法
を教えてください。

350 名前:デフォルトの名無しさん :01/12/10 23:33
ツールバーの空いてるところで右クリック。
「コントロール」という項目を選択する。

351 名前:349 :01/12/11 00:01
>>350
ありがとうございます。
おかげで表示できるようになりました。

メニューの所全部調べてもパレット表示の項目がなかったんで
困っていましたが、右クリックツールバーを表示させればよかったわけなんですね。
でも最初違うウインドウを開いていたので、コントロールパレットが表示されませんでした。
このへんがちょっと混乱させられました。

まだVC++使い始めで付属の入門の本見ながらやってたんですが、
これで再開できます。

352 名前:ppp :01/12/11 13:30
レスがつきませんね、聞き方が悪かったのでしょうか?
お分かりになる方、どうかご教授願います。

353 名前:デフォルトの名無しさん :01/12/11 15:12
>>352 引数に配列の大きさなんか書いてよかったんか?

354 名前:デフォルトの名無しさん :01/12/11 16:02
>>353
それは問題ないと思う。

355 名前:デフォルトの名無しさん :01/12/11 16:09
>>352
ボタンに割り当てた部分のコードとか、どのローカル変数の定義が
どうおかしいと言われたのかを書いた方がいいかと。

356 名前:ppp :01/12/11 18:30
BitmapToRgbのローカル変数の定義がおかしいといわれました。
コードは下記のようになっています。ONCL2がボタンのBnClickedの変数です。
void CVcpictView::OnCl2()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
*--- BitmapToRgb --- 画像変換(Bitmap画像からRGB画像へ)----------------------
hBitmap: 入力Bitmap画像
pr: 出力R画像
pg: 出力G画像
pb: 出力B画像
-----------------------------------------------------------------------------*/
void BitmapToRgb(HBITMAP hBitmap, unsigned char pr[120][160],
unsigned char pg[120][160], unsigned char pb[120][160])
{

357 名前:Kusakabe Youichi :01/12/11 18:49
どうやら、あなたはCの初歩からやり直す必要があるようですね :)
本物の書いた本でも読んでみてはいかがでしょう?

358 名前:Kusakabe Youichi :01/12/11 18:54
In article >>357, Kusakabe Youichi/sage/357 wrote:

> どうやら、あなたはCの初歩からやり直す必要があるようですね :)
> 本物の書いた本でも読んでみてはいかがでしょう?

本物とは?

359 名前:ppp :01/12/11 18:57
レスを下さった方、どうもありがとうございます。
根本的に間違っているのでしょうか?
できたら、その個所の指摘をいただけたらうれしいのですが、

360 名前:デフォルトの名無しさん :01/12/11 19:31
わたしはからかわれていることに気がつきました。

361 名前:デフォルトの名無しさん :01/12/11 19:35
関数の定義、宣言と呼び出しを、きちんと理解しろやゴルァ

362 名前:bou :01/12/11 23:40
OnDraw内なんですけど画像表示の際LoadBitmapはかならずしていないといけないのでしょうか?
LoadBitmapというのは、メモリに特定の画像を転送するようなものだと認識していますが、これをしないと、”キャンパス”自体が作られないように見えます。
このキャンパスに対して別のところから描画してみてもまったく表示されません。なので、LoadBitmapで100*100ほどの白紙を読ませて実験してみたところ、
別のところから描画したものは100*100だけ描画されました。

LoadBitmapというのはキャンパス(受け皿)のようなものも作るのですか?
だとしたら、一旦MDC(CDC)に描画してからpDC.BitBltするような場合は一度希望の大きさの白紙を読ませないといけないのでしょうか????

363 名前:デフォルトの名無しさん :01/12/12 13:12
VC++ SP4 で、以下のコードをコンパイルすると、「error C2668: 'foo' :
オーバーロード関数の呼び出しを解決することができません」とかぬかしやがる
んですが、これってフツーですか。

namespace FOO {
void foo( int ch );
void foo( const char *s );
}

using namespace FOO;
using FOO::foo;

int main()
{
foo( "abc" );

return 0;
}

364 名前:デフォルトの名無しさん :01/12/12 16:36
>>363 のソースがフツーじゃないざんす。

using namespace FOO;
using FOO::foo;

この2行のどちらかをコメントアウトしてみよ〜

365 名前:デフォルトの名無しさん :01/12/12 17:43
>>364
あと文法上は問題ないが、ポインタと int を引数に取る関数の多重定義はやめたほうが
身のためと思われ。

366 名前:363 :01/12/12 17:48
>>364
うーむ、やはり両方の using 宣言を混在させることはできませんか。
これは、C++ の規格上ダメなんでしょうか。それとも VC++ 独自の
問題?

>>365
らじゃ。引数として 0 を与えたときの曖昧性のことですね。

367 名前:デフォルトの名無しさん :01/12/12 19:03
質問というか素朴な疑問なのですが、
関数パラメータのデフォルト値に変数が使えない理由を知りたいです。

例えばブール変数をメンバに持ったクラスでトグル用のメンバ関数を定義するとき、
気持ち的には以下のようにしたいのです。

class my_bool {
public:
 bool elem;
 bool toggle(const bool& b!=elem) { // (*1)
  // 引数が指定されればelemを引数の値にセット
  // 引数が指定されなければelemを反転した値にセット
  elem = b;
  return elem;
 }
};

もちろんこれは(*1)のところでエラーがでます。
これが可能ならば上のような操作を簡潔に書けてハッピーなのですが、
デフォルト値に変数が使われると何かまずいことがあるのでしょうか?

368 名前:367 :01/12/12 19:07
誤植です。正しくは(どうせ間違ってますが)
bool toggle(const bool& b=!elem) { // (*1)
でした。!=が=!

369 名前:中学2年生 :01/12/12 21:38
>>367
最近C++を勉強し始めたばかりなので間違っていたらすみません。
引数が省略されたときの値がコンパイル時に決まっていないとコンパイラが困るからじゃないですか?。

>  // 引数が指定されればelemを引数の値にセット
>  // 引数が指定されなければelemを反転した値にセット

混乱しそうな仕様ですね。

370 名前:七誌 :01/12/12 22:04
>>367
マルチポストすんなよ。馬鹿。

371 名前:367 :01/12/12 22:20
あれ?

369辺りに
『VisualC++の質問じゃなかったですね。すみません。C++相談室に炒ってきます。』
とポストしたはずだったんですが・・・。

372 名前:367 :01/12/12 22:25
>>369
ブール値をスイッチするtoggle()という関数のデフォルトの動作として
値を切り替える。もし値が明示的に指定されたならばその値に切り替える、
というのは感覚的には自然な気がするのですが・・・。

> 引数が省略されたときの値がコンパイル時に決まっていないと
> コンパイラが困るからじゃないですか?。

そういうもんなんでしょうか。
とりあえず今のところそういうもんだということで納得しておきます。
失礼こきましたです。

373 名前:デフォルトの名無しさん :01/12/13 01:05
>372

頭悪すぎ。専用にSet関数作れ。
あとパラメータ渡したときとそうでないときの動作を変えたかったら
別々のtoggle関数作れ。

374 名前:デフォルトの名無しさん :01/12/13 10:44
>>372
感覚的に不自然

375 名前:デフォルトの名無しさん :01/12/13 14:18
>>372
1つの関数に複数の機能もたせるのヤメレ

376 名前:いっぱいいっぱい :01/12/13 14:58
私は、VC1.0を使っています。
コンパイルしようとすると、
自動データセグメント+ヒープの大きさが64キロを越えています。
とのエラーが出ます。
どこがまずいのでしょうか?
困っています。どうかご教授ください。

377 名前:デフォルトの名無しさん :01/12/13 15:18
>>376
メモリモデル設定するオプションがあるはずだから、
さがして、ラージモデルとか、でかそうな名前のメモリ
モデルに変更してください。

378 名前:デフォルトの名無しさん :01/12/13 15:31
>>367
変数うんぬんの前に!=で代入はやめれ。

379 名前:デフォルトの名無しさん :01/12/13 15:43
>>378
というか、代入になってないし
コレが仮に動いたとして…
どうやって「引数が指定されているかどうか」を判断できるんだ?って問題だし
いやいや、まてまて…それ以前にconstに代入するつもりか?

まあ、>>371 を見る限り、C++相談所に行ったよーなので この話は終りかな。
#C++ソウダンジョ…コイツノメンドウハタノンダゾ。

380 名前:いっぱいいっぱい :01/12/13 15:48
メモリモデルはどのようにして変更すればいいのでしょうか?
ご教授お願いします。

381 名前:デフォルトの名無しさん :01/12/13 15:52
>>380
1.0なんて、手元にないからわからないよ。
メニューにオプションって項目ない?

382 名前:いっぱいいっぱい :01/12/13 16:00
>>381
一応オプションという項目はあるのですが、その中にそれらしい
ものがないので。プロジェクト、デバッグ、ディレクトリ、エディタ、
ワークスペース、ツール、カラーという項目が入っています。
このうちのどれかにあるんでしょうか?
よろしくお願いします。

383 名前:デフォルトの名無しさん :01/12/13 16:14
>>382
ヘルプで、メモリモデルって検索できない?
1.0使ってたのは、何年も前だから、まったく覚えてないよ。

384 名前:いっぱいいっぱい :01/12/13 16:19
HELPで検索してみたんですが、<メモリ>ですらヒットしないんです。
どうにがんばってみます。ご教授ありがとうございました。

385 名前:デフォルトの名無しさん :01/12/13 16:31
3年ほどCをやっていて最近C++をやり始めたんですが例外処理ってなんですか?
普通に関数の返り値でエラーかどうか判別すればいいんじゃないですか?
例外をスローするメリットが分かりません。
それどころか例外を捕まえて例外を破棄(?)しないとメモリがリークするらしいのでウザイと思います。
それ以外(特にMFC)は便利だと思います。
例外をスローする関数なんて自分は絶対作りません。
以上です!

386 名前:デフォルトの名無しさん :01/12/13 16:32
>>384
そのころは統合環境つかってなかったから
わからないけどコンパイラのオプション指定の
辺りにないかな?後、リンカもべっこで指定
するんじゃないかな?
以上手元に無いので6.0から推測しました。

コマンドラインなら
cl -ms a.c
とか
cl -ml a.c
って指定するんだけどなぁ。

387 名前:Kusakabe Youichi :01/12/13 16:33
In article >>385, デフォルトの名無しさん/sage/385 wrote:
> 普通に関数の返り値でエラーかどうか判別すればいいんじゃないですか?

「かえりち」と読むのですか?

388 名前:デフォルトの名無しさん :01/12/13 16:34
>>384
メニュー「オプション」−「プロジェクト」でダイアログが出て
「コンパイラ」ボタンで、左側の「カテゴリ」にメモリモデルがある。

389 名前:デフォルトの名無しさん :01/12/13 16:37
>>385
ファイル操作なんかで使わない?

390 名前:デフォルトの名無しさん :01/12/13 16:51
>>385のコーディング

try {
 hoge1();
}
catch(...) {
 エラー処理
}
try {
 hoge2();
}
catch(...) {
 エラー処理
}
try {
 hoge3();
}
catch(...) {
 エラー処理
}

391 名前:役職名無しさん :01/12/13 17:02
>>390
 ワラタ

392 名前:デフォルトの名無しさん :01/12/13 17:31
Windows2000でIOポートを制御するにはどうしたらいいのでしょうか?

393 名前:いっぱいいっぱい :01/12/13 17:49
>>386さん
どうもありがとうございます。
いろいろ試してみます。

>>388さん
アドバイスありがとうございます。
ですが、私はVer1.0を使用しています。
教えてくださった通りにやってみましたが、
ダイアログの中に、「コンパイラ」が見当たりません。

394 名前:デフォルトの名無しさん :01/12/13 19:43
すみません。質問です。
VisualC++のSocketAPIではIPv6ってサポートしてるのでしょうか?

395 名前:デフォルトの名無しさん :01/12/13 20:03
>>392
DDKでドライバを書く

396 名前:デフォルトの名無しさん :01/12/13 20:46
>>394
http://msdn.microsoft.com/downloads/sdks/platform/tpipv6.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/portguid_2pde.asp

397 名前:質問 :01/12/13 21:38
Win32 static libraryでプロジェクトを作った場合、MFCのクラスを使えるくせにクラスウィザードが使えないのにはどういう意味があるの?

398 名前:394 :01/12/14 08:33
ギャー!英語だーー!!
・・・。
>>396
ありがとうございます。
・・がんばって読みます。

399 名前:デフォルトの名無しさん :01/12/17 16:51
APIが対応していないOSでAPIを使うプログラムを作った場合どうなりますか?
例えば GetLongPathName は Win95 に対応していませんが
Win95 で GetLongPathName を使った場合どうなりますか?

1.起動しない
2.APIのところでアプリが落ちる。
3.APIが失敗するだけ
4.その他

いずれにしろ正常に動かないわけですから Win95 では使えないとユーザーに警告する必要はあると思うのですが・・・
ユーザーのOSが分からない場合(オンラインソフトの場合)一般的にどのOSを対象にプログラムを作るべきですか?
Win95 に対応していないAPIは結構あるように見えますが Win95 ユーザーは切り捨てていいですか?
Win95 を使ってるユーザーなんて未だにいるもんですか?

400 名前:デフォルトの名無しさん :01/12/17 17:02
>>399
>ユーザーのOSが分からない場合(オンラインソフトの場合)一般的にどのOSを対象にプログラムを作るべきですか?

OSバージョンチェックの方法は、検索したら出てくると思うよ。

401 名前:デフォルトの名無しさん :01/12/17 17:10
>>399

うちのWebサーバーのログを見てると、95の人はほとんどいないみたい。
企業内で使われてるPCは95が割と残ってるという話もあるけど、
ネットからソフトを落とそうなんて人は、95は使ってないんじゃないの?

402 名前:I'm Win95. :01/12/18 00:26
>399
試してみた。
 「欠落エクスポート KERNEL32.DLLGetLongPathNameA にリンクされています」
 「システムに装着してあるデバイスは、動作していません」
うーん、合掌。
俺は、LFNに変換する時は、APIの FindFirstFileを使っている。

APIの OSごとの挙動を報告するスレみたいなの、誰か作らん?

403 名前:デフォルトの名無しさん :01/12/18 00:46
MSDN見ればええやん

404 名前:デフォルトの名無しさん :01/12/18 01:05
>403
いや、それが分からないもんだよ。
最近出くわした所では、例えば VirtualUnLockは、

 Windows 95/98/Me: Included in Windows 98 and later.

となっているが、
95でも「欠落エクスポート〜」のエラーにならず、起動できてしまう。
何で Windows 98 and later なんて書くんだ yo!
そもそも、9x系はこの APIは何もしないんだから、何で Unsupported に
しないんだ yo! VirtualLockは Unsupported と書いてあるのに。

まぁ、このあたりの挙動は、システム DLLのバージョンによるところが大きいのかもね。

405 名前:デフォルトの名無しさん :01/12/18 14:00
しょうもない質問で申し訳ないんですが、教えていただけませんか
Win2000+ADSLの環境でIPアドレスを取得したいのですが、
LAN内のIPアドレスが返ってきてしまい、WAN側?(インターネット側)の
IPアドレスを取得することが出来ません
ご存じの方取得方法をご教授ください よろしくお願いします

406 名前:デフォルトの名無しさん :01/12/18 15:09
ADSLのルータがNATかましているなら外側のIPを自力では
取得できんはず。NATやめるか、外側にリフレクタを置い
てIPを知らせてもらえば?

407 名前:405 :01/12/18 16:18
>>406
げふ... そうなんですか
その辺調べてみます ありがとう

408 名前:デフォルトの名無しさん :01/12/18 16:31
ルータによってはAPI公開してて、それ使ってIP取得できる場合もある。
汎用性もクソもないけど。

409 名前:405 :01/12/18 16:39
>>408
そうなんですか 流石に汎用性が無いのは困りますね
Win2000標準のipconfig.exeを使えばちゃんと表示されるんですけど
どうやってIP引っ張ってきてるんでしょうね...

410 名前:デフォルトの名無しさん :01/12/18 17:15
プロセスのセキュリティ関係について、分かりやすく解説したサイト
とか、無いですかね?

セキュリティ記述子だの、ACLだの、トークンがどうのだの...
訳が分からない。

411 名前:しいたけ :01/12/18 23:06
win32aplicationでエディットボックスを使ってキーボードから入力された文字を
画面に文字を表示させたいのですがエディットボックスを作るプログラムがわかり
ません。msdnコレクションを見たりもしてるんですが、何が何だかさっぱりわかり
ません(T_T)わかる人がいたら教えてくださ〜い。

412 名前:デフォルトの名無しさん :01/12/19 05:12
VC6付属のfstreamの挙動でわからないところがあるので、教えてください。
まず、ソースは以下です(test.cpp, test.exe とします)。

#include <iostream>
#include <fstream>
using namespace std;

int main(int c, char **v) {
 istream *in = new ifstream(v[1]);

 int ch;
 int count = 0;
 for(ch = in->get(); !in->eof(); ch = in->get()) {
  count++;
  if (count == 50) {
   cerr << in->tellg() << endl;
   count = 0;
  }
 cout << (char)ch;
 }
 return 0;
}

また、以下の内容のファイルを作って
*** 改行コードを LF にして ***
保存しておきます(in.txtとします)。
aaaaaaaaaa
bbbbbbbbbb
cccccccccc
dddddddddd
eeeeeeeeee
ffffffffff
hhhhhhhhhh
iiiiiiiiii
jjjjjjjjjj
kkkkkkkkkk

413 名前:412続き :01/12/19 05:13

で、
$ test.exe in.txt 1>sout.txt 2>serr.txt
とすると、sout.txtは、
aaaaaaaaaa
bbbbbbbbbb
cccccccccc
dddddddddd
eeeeeeeeeeeeeeee
ffffffffff
gggggggggg
hhhhhhhhhh
iiiiiiiiiiii
jjjjjjjjjj
となっていました。
予定では in.txt と sout.txt の内容は同じになるはずだったのです。

in->tellg()の行をコメントアウトすれば、期待通りの動作をします。また、
in.txtの改行コードを CRLF にしても期待通りの動作です。
デバッガでみたところ、tellg()によってなぜかファイルポインタが少し前のところに
戻っているようです。

また、VC付属のものの代わりにSTLPortを使ったところ、tellg()の有無に
関わらず期待通りの動作をします。

これは使い方が悪いのでしょうか?それともVC付属のライブラリのバグ
ですか?

414 名前:デフォルトの名無しさん :01/12/19 10:13
ダイアログバーにリストボックスを埋め込もうとしているのですが、リストボックスのメンバ変数の取り方がわかりません。
ダイアログバーではDoDataExchangeは呼ばれないんですよね?
どうすればいいのでしょうか?

415 名前:デフォルトの名無しさん :01/12/19 13:52
厨房の質問です。
GUIなど使っていないプログラムで、ReleaseとDebugでコンパイルした
場合に挙動が違うんですが、同じプログラム書いていて挙動が違くなる
原因って一般的にはどんなことがあるんでしょうか。。。
宜しくお願いします。

416 名前:デフォルトの名無しさん :01/12/19 14:04
>>415
GUI なアプリでも同じこと。

たとえばメモリを初期化せずに使っているとか、
解放したあと、まだそのメモリを参照してしまっている…とか、
まぁ、いろいろあるよな。

417 名前:415 :01/12/19 14:07
>>416
デバッグ版だと初期化すべきところでしてなくても、
勝手に初期化してくれる(配列を零で初期化してくれるとか)ということが
あるということですか?

418 名前:デフォルトの名無しさん :01/12/19 14:10
>>415
初期化してない変数を使った。
ReleaseとDebugでごみの値は違うことが多い。

419 名前:デフォルトの名無しさん :01/12/19 14:11
>>417
初期化しない変数は、何が入ってるかわからない。
DebugとReleaseで入っている値が違うということ。

420 名前:415 :01/12/19 14:14
>>418 >>419
なるほど。デバッグ版で動いているのはたまたまってことですね。
白み潰しに見てみます。ありがとございましたー。

421 名前:デフォルトの名無しさん :01/12/19 14:20
ワラタ
どうでもいいがモノスゴイ被り様だな。

422 名前:デフォルトの名無しさん :01/12/19 21:47
#ifdef _DEBUG
for(i=0 ; i<num ; i++)
{
 if(item[i] == 0)
 {
  MessageBox(hwnd , "バグってるぞ!" , "オラオラオラ!!" , MB_OK);
 }
}
#endif

といった具合にプリプロセッサでデバッグモードのときだけエラーを表示させているんですが
#ifdef _DEBUG の部分を "_" を書き忘れて #ifdef DEBUG とかやっててリリースモードで実行中に
メッセージボックスがでてビビリまくりな時があります。
#ifdef _DEBUG の記述を間違えてもコンパイラはエラーを出さないため
逆に恥ずかしいバグを発生してしまうことがあります。
#ifdef _DEBUG を間違わずに書く方法ってないですか?
デバッグモードの時だけコードが有効になって記述ミスした場合コンパイルでエラーか警告が出るようなやり方希望です。

423 名前:デフォルトの名無しさん :01/12/19 22:06
>>422 VC++なら、TRACEマクロ使えば良いでそ

424 名前: :01/12/19 23:41
人の作ったプログラムを改造しているのですが
スタティックテキストのくぼみが、スクリーンセーバー解除後に
消えてしまいます。他のWINDOWで一度遮ってやると復活します。
FillSolidRect等を使って背景を描画しているみたいなのですが、
何が考えられるでしょうか。

425 名前:デフォルトの名無しさん :01/12/20 08:34
>422

usertype.datに_DEBUGなどのキーワードをを登録しておくという方法はなかなか有効だったりする。

ただしやりすぎるとdatが1万行を軽く越えるけど。

426 名前:デフォルトの名無しさん :01/12/20 08:58
>>422
const bool DEBUG = TRUE;
//...
if(DEBUG)
{
 HOGE();
}
みたいなのをプログラミング作法では推奨してたな。

427 名前:デフォルトの名無しさん :01/12/20 09:20
これってreleaseでfalse時には、きれいさっぱり無くなってくれるの?

428 名前:デフォルトの名無しさん :01/12/20 09:30
>>427
VC++6では、最適化で削ってくれる。
他のコンパイラでも、このくらいやってくれると思う。

429 名前:デフォルトの名無しさん :01/12/20 09:30
#ifdef _DEBUG
じゃなくって
#if _DEBUG
にでもすれば?

430 名前:デフォルトの名無しさん :01/12/20 11:54
当方初心者です。
EDITViewを基本クラスにして、メニューバーから
選択してFromViewを開く方法がわかりません。

プロジェクト追加しないといけないのですか?

431 名前:デフォルトの名無しさん :01/12/20 12:53
>>430
??FromViewってなんだ?何かの派生クラスか?

432 名前:デフォルトの名無しさん :01/12/20 14:53
>431
CFormViewでしょう。

433 名前:431 :01/12/20 15:16
>>430
ダイアログボックスじゃ駄目なのか?

434 名前:430 :01/12/20 17:27
あ、ごめんなさい。CFormViewですね。
まだ先頭にCをつける癖すらついていません。

あれからいろいろやってみて、ダイアログボックス
なら開いた。という状態に持ってこれたのですが、
ダイアログボックスのID_EDITに入力された内容を
ボタンを押して、親ウィンドウに反映されるには
どのようにしたらよろしいのですか?

一部表現が変ですけど、ご容赦ください。

435 名前:万年カレンダー :01/12/20 22:56
年と月を入力するとカレンダーが出てくる予定です
y:年、m:月、d:出力する日付、n:マスの番号、l:最後の日
#include<stdio.h>
void main()
{
int y,m,d=1,w,n=1,l;
printf("年=");
scanf("%d",&y);
printf("月=");
scanf("%d",&m);
printf("[ %d年%d月 ]\n",y,m);
printf(" 日 月 火 水 木 金 土\n");
printf("---------------------\n");
if(m==1 || m==2){
y--;
m=m+12;
}
w=(y+y/4-y/100+y/400+(13*m+8)/5+d)%7;
if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12){
l=31;
}
else if(m==4 || m==6 || m==9 || m==11){
l=30;
}
else{
if(y%4==0 && y%100!=0){
l=29;
}
else if(y%400==0){
l=29;
}
else{
l=28;
}
}
for(w;w>0;w--){
printf(" ");
n++;
}
for(d;d<l+1;d++){
printf("%3d",d);
if(n%7==0){
printf("\n");
}
n++;
}
printf("\n");
}

閏年の判定がおかしい
else-ifもうまくいかない

436 名前:デフォルトの名無しさん :01/12/21 12:45
いや〜_allocaって便利ですね。
スタックからメモリを確保するのでメモリが断片化することなく嬉ピーです。
関数内で可変長のメモリが必要なときに重宝しております。

437 名前:デフォルトの名無しさん :01/12/21 13:32
>>434
ID_EDITってのはエディットボックスのIDか?
そうなら、そのIDとCEditあたりを対応させて、入力された内容を拾えばよろしい。

438 名前:デフォルトの名無しさん :01/12/21 13:48
if (y % 4) {
 l = 28;
} else if ((y % 100) != 0 || (y % 400) == 0) {
 l = 29;
} else {
 l = 28
}

439 名前:Kusakabe Youichi :01/12/21 14:00
In article >>438, デフォルトの名無しさん/438 wrote:

> if (y % 4) {
>  l = 28;
> } else if ((y % 100) != 0 || (y % 400) == 0) {
>  l = 29;
> } else {
>  l = 28
> }

28と29の2種類しかないのだから、2つに場合わけするか
もしくは4つにわけるかのほうが素直な書き方ですよね。

440 名前:万年カレンダー :01/12/21 14:07
判定部分のyをy+1に書き換えたらちゃんと動いたYO!

>>438
ifの条件式って0と1以外でもいいの?

441 名前:デフォルトの名無しさん :01/12/21 14:10
>>440
0と比較できればなんでもおげ

442 名前:万年カレンダー :01/12/21 14:20
if(m==1 || m==2){
y--;    ←これが原因だったみたい
m=m+12;
}
何度も修正してると
どんどんリソースが減っていくのはなぜ?

>>441
なる

443 名前:デフォルトの名無しさん :01/12/21 15:00
m==1じゃなくてm==13ね

444 名前:デフォルトの名無しさん :01/12/21 15:01
こういうことにならないように、その月の1日の曜日を求める関数とかを作るわけだ。

445 名前:デフォルトの名無しさん :01/12/21 15:03
こんいちは。
Cで書かれたプログラムをC++のプログラムから呼ぼうとしていますが
できません。Cのソースは10年前くらいのもので、VCを使って
コンパイルしてオブジェクトファイルを作りました。それを呼ぶ
メインがあるファイルを*.cにするとエラーなしで、*.cppにすると
LNK2001の未解決なんたらが出てリンクができません。拡張子が
違うだけで中身はまったく一緒です。どうしたら
いいでしょう?

446 名前:デフォルトの名無しさん :01/12/21 15:15
>>445
C++のリンケージについて勉強する。

447 名前:デフォルトの名無しさん :01/12/21 15:16
extern "C"
だっけ?

448 名前:デフォルトの名無しさん :01/12/21 15:47
それ書きました。Cのヘッダファイルに。>>447
でもだめでした。。C++のメインの方では
何かすることありますか?

449 名前:デフォルトの名無しさん :01/12/21 16:17
ん〜でも今テストしててCで書かれた関数はコメントアウトして
あるんですが・・ヘッダに定義されてる変数を使おうとしただけで
だめなんです。おかしくないですか?

450 名前:デフォルトの名無しさん :01/12/21 16:19
あっできた

451 名前:デフォルトの名無しさん :01/12/21 16:21
をろ?
なにが悪かった?

452 名前:412 :01/12/21 16:49
>>412の件ですが、ソースをみたところ、テキストモードで開くことを
想定しているのはCRLFなファイルだけみたいでした。ftell()が場所を
計算するときに、LFがあると、それは問答無用でCRLFからLFに変換
されたものだとみなされて、2バイト分として扱われていました。

STLPortと挙動が違うのは、VCのほうではpubseekoff()がtellg()のなかで
つかわれていたためでした。

では逝ってきます。

453 名前:デフォルトの名無しさん :01/12/21 16:55
C++のメインの方でCのヘッダをインクルードしているところを
extern "C"{}で囲ってみました。
最初はCのヘッダファイルのほうで定義を同じもので囲ってました。

454 名前: :01/12/21 23:04
       HANDLE hWave=NULL;
hWave=LoadResource(AfxGetResourceHandle(),
FindResource(AfxGetResourceHandle(),
MAKEINTRESOURCE(name),"WAVE"));
LPSTR lpData=(LPSTR) LockResource(hWave);
sndPlaySound(lpData,SND_MEMORY|SND_ASYNC);
UnlockResource(hWave);
FreeResource(hWave);

SND_ASYNC;
SND_LOOP;

のようにしてWAVEファイルを今まで再生していました。これは、リソースに読み込んで(WAVEファイルを)使っていたんですが、
外部のWAVEファイルを、ファイル名を指定する形で用いることはできるのですか?

455 名前:デフォルトの名無しさん :01/12/21 23:08
>>454
PlaySound()

456 名前:デフォルトの名無しさん :01/12/22 00:26
XPに対応してますか?VisualC++6.0

457 名前:( _ 。。) _ バタ。 ◆lUd9keO2 :01/12/22 01:16
>>456
なんとか。 というか、 NT5.2 (だっけ) だから 2000 ベースで考えていいかと。

458 名前:デフォルトの名無しさん :01/12/22 01:30
>>457
ありがとう。ちなみに7.0はいつ?

459 名前:デフォルトの名無しさん :01/12/22 01:49
>>457
Windows 2000 == Windows NT 5.0
Windows xp == Windows NT 5.1
98 と 98SE 程度の違いだ。

>>458
英語版はもうそろそろらしい。
日本語版は一月か二月遅れるだろ。

でも、7.0 から C# がメインになりそうな感じだし、
VC++7.0 ってあんまり意味ないかも。

460 名前:デフォルトの名無しさん :01/12/22 03:17
VC++/C# Ver7.0 そのつぎは、やっぱ C# Ver1.0 ?

461 名前:( _ 。。) _ バタ。 ◆lUd9keO2 :01/12/22 11:47
>>459
あ。 5.1だったか、 フォローサンクス。

>>459
この手の開発系アプリケーションって…
ちゃんとしたヴァージョンアップが5〜6あたりまで続いた後は…

1:無駄な贅肉がついていく(80%)
2:ほとんど変化が無い(30%)
3:まだまだ頑張っている(10%)

のうちのどれかになるよな……。 こぽこぽ。

462 名前:デフォルトの名無しさん :01/12/22 12:15
人はそれを安定期と呼ぶ。
正直言ってVC++は5.0で実用上全く問題ないレベルなんで、そんなに頑張って
更新しなくてもいいかと。いまだに5.0の人多いし。

463 名前:デフォルトの名無しさん :01/12/22 14:53
IDEの強化とコンパイラのtemplate対応強化を希望したいところなんだけど。

464 名前:デフォルトの名無しさん :01/12/22 17:59
ISO標準C++を完全に満たしてから安定期に入ってくれぃ

465 名前:デフォルトの名無しさん :01/12/22 20:04
>>462
> 正直言ってVC++は5.0で実用上全く問題ないレベル
ARM の頃のテクニックしか使わないと問題ないんだが template 使うと辛いこと多いんだよな。個人的
に困ってることを列挙。

1 partial specialization が使い物にならない。
 template <typename T, bool Threaded> Allocator {};
 template <typename T, true> Allocator {};
 template <typename T, false> Allocator {};
 とか書きたいことが、しばしば。

 あと引数の数を可変にした template メソッドを書く方法もあるんだが、これも parial specialization
 が使えないと実装できん。

2 foo<int>(), foo<float>() を呼び分けられない。

3 template<int N> struct X { int n[N]; }; が「要素数 0 の配列を定義している」と怒られて、コンパイル
 が通らないケースがある(もちろん N に 1 以上の数を渡してる)。どうもテンプレート化するタイミング
 に依存するみたいで、通ることもある。とりあえず n[N + 1] にしておけば回避できる。

4 void 型の関数で return (void型関数) とやると、コンパイルエラーになる。このため std::mem_fun_t()
 が void 型のメソッドでは使いものにならない。

466 名前:  :01/12/23 06:02
virtual long __stdcall IOleWindow::GetWindow(struct HWND__ * *)" (?GetWindow@IOleWindow@@UAGJPAPAUHWND__@@@Z)" は未解決です
Debug/VCapture.dll : fatal error LNK1120: 外部参照 1 が未解決です。

ってどのライブラリにリンクすりゃいいかなんてどこで調べるんだい?

467 名前:デフォルトの名無しさん :01/12/23 07:17
msdn

468 名前:デフォルトの名無しさん :01/12/23 07:53
なんで、IOleWindowの参照を、COMではなくてリンカが解決しようとするんだろう‥‥?

469 名前:デフォルトの名無しさん :01/12/23 13:42
#undef _PURE
とか

470 名前:デフォルトの名無しさん :01/12/23 19:45
ダイアログベースで作成して、これにリソースエディタでメニューをつけました。
これを実行してみたらメニューのところだけへこんでるのですが
他のところと高さを合わせるようにできませんか?

471 名前:デフォルトの名無しさん :01/12/24 02:32
えくすきゅうすみぃ、ソースで読み込みたいライブラリ指定する方法が思い出せず、探しても見つかりません。たすけてくだされ

472 名前:デフォルトの名無しさん :01/12/24 03:02
#pragma comment(lib,"hoge.lib")

473 名前:471 :01/12/24 22:46
ありがとうございますだ。

474 名前:デフォルトの名無しさん :01/12/24 23:07
gogoをコンパイルしようとすると、
c:\windows\system32\cmd.exe の実行エラー
って怒られるんですけど、何でシステムファイルの実行エラー?
OSはWin XP使ってます。

475 名前::01/12/25 05:54
ある構造体の中の様々な変数などに、外部のファイルから読み込んで初期値を与える、というようなことをしたいのですが、
どのようにするのが最も簡単でしょうか?

476 名前: :01/12/25 06:01
SetTimer(NULL,MYID,wait,My_TIMER_PROC);
でさ、コールバック関数(static)内でthisポインタ使いたいんだけど、
パラメータでthis渡せないよね。
どうしたらいいっすかね?

477 名前:デフォルトの名無しさん :01/12/25 07:08
>>475
fread(buf,sizeof(構造体),1,fp);
>>476
staticメソッドにthisはねえよ。パラメータで渡しとけ。

478 名前:デフォルトの名無しさん :01/12/25 07:23
>>477
だから、TimerProcにパラメータ渡す方法がねぇってんだろが。
ウィンドウに属さないタイマーの場合、Timerprocが属してるclassを
singleton化してstaticメンバにthis保存するぐらいしか思いつかん。

479 名前:デフォルトの名無しさん :01/12/25 07:44
つーかコールバックするならマルチメディアタイマ使えば?

480 名前:デフォルトの名無しさん :01/12/25 07:57
>>478
nIDEvent(SetTimerの2番目の引数)で渡せるっぽい。
SetTimer(NULL,(UINT)this,1000,(TIMERPROC)TimerProc);
とかみたく。

481 名前:デフォルトの名無しさん :01/12/25 08:18
MFCを使って、中が透明な円を書きたいのですが。
どうしても塗りつぶされてしまいます。どうしたらいでしょうか?

482 名前:デフォルトの名無しさん :01/12/25 09:12
>>481
SetBkMode(TRANSPARENT)とかでできんか?
知らんが。

483 名前:デフォルトの名無しさん :01/12/25 09:18
黒く塗れ!!

484 名前:デフォルトの名無しさん :01/12/25 09:45
>481
SelectObject(GetStockObject(HOLLOW_BRUSH))

485 名前:デフォルトの名無しさん :01/12/25 11:47
>>481
MFCなら CDC::SelectStockObject(NULL_BRUSH) を呼んでから円を描け

486 名前:デフォルトの名無しさん :01/12/25 11:57
>>482 >>484 >>485
ありがとうございました。

487 名前:教えて君 :01/12/25 16:34
CViewベースで作成して、メニュー欄からダイアログを
開いて、そのダイアログのエディット欄に入力された情報を
OKボタンが押されたときに、View側に反映させたいのですけど、
CXXXDoc.cppに
CXXXDlg dlg;
if(dlg.Create()==IDOK){
m_CurLett=dlg.m_text;
}
と入力した後、
CXXXDoc.hに
// アトリビュート
public:
CString m_CurLett;
と入力してm_CurLettに値を入れるところまで行ったんですけど、
この値をView側に表示させる方法が分かりません。
お願いします。この後どうすれば良いのか教えてください。

488 名前:デフォルトの名無しさん :01/12/25 16:53
InvalidateRectして、WM_PAINTのハンドラでTextOutしてください。

489 名前:デフォルトの名無しさん :01/12/25 23:47
質問です。
アクティブなIEが見ているURLを得る方法って有りますか?

490 名前:デフォルトの名無しさん :01/12/26 00:14
>>489
やったことないけど Browser Helper Objects 書けば出来そう。MSDN Library に解説があります。

491 名前:デフォルトの名無しさん :01/12/26 03:04
Google Toolbarみたいな独自のツールバーを作るにはどうしたらええんかのう

492 名前:デフォルトの名無しさん :01/12/26 04:16
>>491
最近 ATL ML で紹介されてた。
http://www.cheztabor.com/toolband/

493 名前:デフォルトの名無しさん :01/12/26 11:52
MFCとSDK、どちらでプログラム書いている人が多いですか?

最初は入門って事でMFC使ってましたが、ゲームのプログラムとかを
作っていると、MFCでは重くて使い物にならないことが分かってきました。
配布するときも、ライブラリ依存になってしまうし......
最近では、SDKばっかりです。皆さんはどうでしょうか?

494 名前:デフォルトの名無しさん :01/12/26 13:34
>>493
SDKってWin32APIのことでいいのか?
VCは趣味でゲーム作るくらいだから俺はAPIオンリー。
MFCもそのうちやろうかと思ってはいるが、あまりいい話聞かないし、
普通のアプリ作る予定もないから今のところ永久に保留中。

495 名前:デフォルトの名無しさん :01/12/26 13:49
>>493
>配布するときも、ライブラリ依存になってしまうし......

「ライブラリ」ってどれのことだろう。

496 名前:デフォルトの名無しさん :01/12/26 13:51
入門ならSDKじゃないの?
俺と順番が逆だ。

497 名前:デフォルトの名無しさん :01/12/26 14:05
WinInetを使用してFTPクライアントを作っています。
パーミッションの取得・変更ってどうやるんですか?
ソケットレベルで自分で書かないと無理ですか?

498 名前:デフォルトの名無しさん :01/12/26 15:00
VB経験者なら、MFCの方が理解しやすいかも・・・

499 名前:デフォルトの名無しさん :01/12/26 15:31
>>493
個人で書いてるプログラムには ATL/WTL 使ってます。

ATL/WTL はMFC よりも機能的に劣る部分もありますが「API の薄いラッパクラス」という感じで、
ゲームなどを作る場合には向いてると思います。テンプレートライブラリだから DLL の類も不要
ですし。

(唯一の問題は解説が少ないことか。規模が小さいライブラリだからソース読めば良いんだけど)

500 名前:デフォルトの名無しさん :01/12/26 16:07
指定したディレクトリの全ファイル名を取得する方法を教えてください。
SearchPathを使ってやりましたがうまくいきません。
よろしくお願いします


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.