VisualC++相談室 6

このエントリーをはてなブックマークに追加
10194
だれか詳しく教えてくらはい。
資料でもいいしサイトでもいいのでおねがいします
google
>>98
漢字 = 漢字(文字圏) = MBCS文字圏
かもしれないじゃないか。すげぇよ!その共通理解。
>>96
ダイアログだったら、ENTERキーが押されるとIDOKが送られる。
OnOK()の中でフォーカスの位置を調べて、リストボックスに
フォーカスがあったらENTERキーの処理をする、というのではどうか。
10594:02/02/02 00:42
おまえらじつは詳しくないのか?
聞いても無駄かな・・
>>98
半角、全角はもともと文字の横幅をあらわしたもの。
JISだかで偶然(意図的に?)半角文字が1バイトに、全角文字が2バイトに割り当てられただけ。
>>94
まずどんなコード書いたら_ismbbleadがうまくいかなかったのか書いた方がいいと思われ。
文字列の中から先頭バイトを引っこ抜いてやるとうまくいかないと思った。
10894:02/02/02 01:41
>>107
文字列の任意の場所から1バイト持ってきて漢字(2バイト文字)か1バイト文字か調べようとした。
なんかちゃんと判定できない奴とかあった。
char hoge[] = "ほげほげ";
の文字列に対して、
if(_ismbblead(hoge[2]))
ならいいけど
char hoge = hoge[3];
if(_ismbblead(hoge))
ならまずいんじゃなかったっけ

>>94
つーか、文字コード何だよ?Shift JIS なら
> 文字列の任意の場所から
判るわけないだろ。
>>108
SJISの場合原理的に不可能だそれは。
11294:02/02/02 01:56
つまりその原理が知りたい。
俺は「便利な関数がありますよ!」だけいうMSは嫌い。
原理を知らずに関数など使えない。

でも資料がない。

SJIS教えて?以前みたソースでIsKanji()みたいなマクロがあって
それは任意の場所のcharを見て判断してたよ。
ウソクサっと思ったけどウソという確信も持てないし。
113SJIS:02/02/02 02:01
char[任意の場所] と、char[任意の場所-1]の符号を見れば、
区別つくんでない?
>>113
つかない。
文字列先頭か、あらかじめトレイルバイトじゃないとわかってるところから始めるのが現実的。
本当に資料が無いのだろうか。
俺は検索もせずに「教えて」だけいう厨房は嫌い。
>>113
char[任意の場所] が英数の範囲内で、char[任意の場所-1]がSJISの
1バイト目、2バイト目の共通部分だったらどう判断するの?
11794:02/02/02 02:09
>>115
すまん。一応検索したんだがたくさん引っかかってメンドくなって・・
2chで聞いた方がたいがい早いし。
>>117
全然原理を知る気ないやん。
黙ってMSの便利な関数使ってれ。
おとなしく_ismbslead使え
12094:02/02/02 02:14
ちなみに以前見たソースってのは

0x81〜0x9f
0xe0〜0Xfc
は漢字って判定だった。
121113:02/02/02 02:24
スマソ。詫びにこんなのを見つけた。

int IsLegal(const char *s){
  unsigned char u=*s, v=*(s+1);
  return ( ((0x81<=u && u<=0x9F) || (0xE0<=u && u<=0xFC))
    && ((0x40<=v && v<=0x7E) || (0x80<=v && v<=0xFC)) );
}
あとは漢字コードとにらめっこして納得すれば、IsKanji()も何をやってるのか
か分かるね。
12294:02/02/02 02:28
>>121
サンクス。感謝感激

でもSJIS任意の位置からは原理的に無理って意見もあるし、
このIsLegalのsは先頭のアドレスって限定した使い方なのかな。
123119:02/02/02 02:32
_ismbsleadはだめなのか?
12494:02/02/02 02:35
>>123
_ismbbleadは先頭から順に調べないとダメらしいのですが、
それも別のところで聞きかじっただけです。

よってダメじゃないかもしれないけど。なんかこういう不確かな情報を払拭する
「これだーーーーー」ってのが無いかなぁ
>>124
_ismbsleadはまさに「先頭から順に調べないとダメ」を体現してる気がするけどなぁ。
なんだ只のバカかよ。ツマンネ
12794:02/02/02 03:23
どうやら先頭から調べなきゃいけないで決まりらしい。
ってことは結構インチキ判定ロジックがちまたにゃあふれてんじゃねーか。
つーか、あ^−−−−−−この「らしい」ってのがゆるせん。
なんだよ「らしい」って
なんだよ「らしい」って
なんだよ「らしい」って
なんだよ「らしい」って
なんだよ「らしい」って
結局俺は糞みたいな半端な知識止まりらしい。ウザ
「どうやら先頭から調べなきゃいけない」←これが「原理」かよ。
少しは頭使えよ。考えたらわかるだろ。
>128
94が考えてもわからないことぐらい考えたらわかるだろ。
表とか坂とかね。
13198:02/02/02 04:09
ハァ…ヤレヤレ
半角、全角については、2バイト半角が現れたPC-9801の時代に終わってるよ。
でも、「漢字のひらがな」がどれほど正確なんだ?
つか、みんなネタか?
13294:02/02/02 04:10
うんうん。やっぱ文字コードの仕様は糞だな。
それは確かだ。
133デフォルトの名無しさん:02/02/02 06:20
CreateThread()で作ったスレッドからCランタイムライブラリの関数呼ぶと
メモリリークが起こるんですよね?(と、MSDNライブラリに書いてある)
ではnewも出来ないのでしょうか? なんとなく中でmalloc()してそうだし。。。

# だめなら _beginthread() 使います
134133:02/02/02 07:20
役に立つかどうかわりませんが。
# Shift JIS 限定の話です
Shift JIS は以下の三つの文字集合を使います。
(1) JIS X 0201 のラテン文字集合部分
(2) JIS X 0201 のカタカナ文字集合部分
(3) JIS X 0208 の文字集合
JIS がついているところから分かるように、これらは JIS規格で決まっています。
どのような文字が定義されているかというと、
(1) 1バイトのアルファベットや記号
(2) いわゆる半角カナ
(3) 2バイトのアルファベットや記号や漢字

これらに一文字ずつ区別がつくようにコードを振ることをエンコードといいます。
Shift JIS の場合、
(1) 0x21〜0x7E
(2) 0xA1〜0xDF
(3) 1バイト目 0x81〜0x9Fまたは0xE0〜0xFC、2バイト目 0x40〜0xFC(ただし0x7Fを除く)
となっています。ここから分かるのは
・(1)と(2)はすぐに区別が付く
ということです。これは Shift JIS が出来たときの事情がからんでいるのですが。
しかし、(3)に対しては
・1バイト目は(1)、(2)ともにかぶらない
・しかし2バイト目は(1)、(2)とかぶっている
という問題があります。
ですから、ある位置の1バイトが(3)の一部かどうか判定するには、
「0x40より大きくて、(3)の2バイト目と(1)(2)のどちらか区別が付かない場合は、
さらに一つ前の1バイトを読み込んで、(3)の1バイト目かどうかを調べる」
というのが正解です。
>>134
SJIS はバイト列の途中から読もうとすると面倒だけど、頭から読むなら isleadbyte() が
真なら 2 バイト文字の 1 バイト目、そうでなければ 1 バイト文字、で簡単に判別できる
よね。

そもそも文字コードが SJIS かどうか分からん場合には、文字コードを統計的に推測す
るしかない。方法に関しては nkf のソースでも読んで研究して見てくれ。
> そ。「JIS X0208 という漢字セットの中のひらがな」。

だから「漢字のひらがな」という言い方が正しい?
こいつバカですか?
>>136
少なくとも「漢字のひらがな」よりは「全角のひらがな」のほうが100倍ましだと漏れも思う。
>JIS X0208 という漢字セット
0点。じゃあ、「漢字のアルファベット」に、
「漢字のキリル」か。おめでてーな。
>一つ前の1バイトを読み込んで、(3)の1バイト目かどうかを調べる
実は、そこは2バイト目という罠
>>116でソトデという罠
14194:02/02/02 18:27
>>133
おおおーーすばらしい・・・
丁寧にありがとうございます。やっと理解できました。
早速my資料に追加・・とφ(.. )カリカリ・・
> 一つ前の1バイトを読み込んで、(3)の1バイト目かどうかを調べる
実は調べたいのは文字列の最初の文字で、一つ前のバイトなど存在しないと言う罠
「半角って何ですか?」 by void
CListBoxで
リストのうちの何番目かを
指定して反転表示させたいのですがよくわかりません。


まずgoogれ、話はそれからだ
>>143
半角板
147133:02/02/02 19:29
>>139
そのときは、1回目に読んだ1バイトは(1)または(2)だったことが分かります。
148デフォルトの名無しさん:02/02/02 19:44
>>147
1つ前が(3)の2バイト目だったのか、(3)の1バイト目だったのかは、
文字列の頭から見ていく以外に確かめる術は無いのです。

例) 0x9B .......... 0x9B 0x9B 0x44 0x44 の後ろから2個目の0x44を判定せよ。
>>147
1バイト目と2バイト目が両方とも_ismbblead()==trueのマルチバイト文字が延々と続いてるときはどうするんですか?
どこを文字列の先頭とするかでコードの解釈が180度変わります。
途中だけ見て判断するのは不可だね。
150133:02/02/02 20:29
>>148 >>149

まったくもってその通りです。
(3)の1バイト目か2バイト目か判別出来ないときは
さらに1つ前の1バイトを……というのを、識別出来るまで
延々とやらなければいけないですね。

嘘言っちゃってゴメン
つか、wchar_tつかえよ、、、
152_:02/02/03 01:00
VCのスタンダード版は静的リンクができないけど、コンパイルしたプログラムは
他人のパソコンでも動きますか?MFCのDLLが必要なのですか?
>>152
まあ、だいたい大丈夫だね。
たまーに動かない人がいるみたいだけど。
154なんかねぇ:02/02/03 02:12
VC++5.0エンタープライズ版
を使っていますが、6.0を買いなおした
方がいいですか?


いまVC6を買うのはただのばかだなぁ
>155に同意

Web系だと不便かも知れないけど
そうじゃなけれ5.0で良いのでは?
157デフォルトの名無しさん:02/02/03 07:42
質問です。
現在 Win32 console application を作っているのですが、
現在のコードページに対応(_getmbcp())して表示させるヘルプを日本語と英語で分けようと考えてます。

次のようにコーディングしたんですが、

switch (_getmbcp())
{
case 932: lang = LANG_JA_JP; break;
default: lang = LANG_EN_US; break;
}
printf("code page = %d\n", _getmbcp()); /* debug のため表示 */

コマンドプロンプトで us して実行しても 932 になってしまいます。
chcp をオプションなしで実行すると
Active code page: 437
と表示されるのですが…
どうすれば _getmbcp() できちんとコマンドラインの状況を判断できるでしょうか。
>>157
訂正。日本語が変でした。

>どうすれば _getmbcp() できちんとコマンドラインの状況を判断できるでしょうか。

どうすればきちんとコマンドラインで設定されているコードページを取得できるでしょうか。

159デフォルトの名無しさん:02/02/03 10:21
VC6.0の調子がおかしくなってしまいました。
通常、ワークスペースを開くと、ClassViewにクラスとメンバの一覧が
表示されますが、それが表示されなくなってしまいました。
また、ビルドを行おうとしてもできなくなりました。
但し、この現象が起きるのは最近、新規作成されたワークスペースに
ついてであり、昔作っていたワークスペースでは
問題なく表示され、ビルドも可能です。

私なりに問題点を調べてみたのですが、どうもdpsファイルの中の
TargetのSource Fileの部分で、問題あるワークスペースの方で、
# PROP Exclude_From_Scan -1
# PROP BASE Exclude_From_Build 1
# PROP Exclude_From_Build 1
という3行が挿入されていました。
この現象について何かご存知の方おられましたら教えて下さい。
>>159
おいらも時々なるかも。

いくつか要らない(と思われる)ファイルを消して起動しなおせば直るんだけど,フォルダ
作ってたらそれも作り直しなので安全な修正方法あれば漏れも知りたい。
161157:02/02/03 12:29
>>157-158
自己解決しました。
GetConsoleCP() 使ったらうまくいきました。

ちょっと Win95 でどうなるか不安ですが…
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_getconsolecp.htm
CListBoxで
リストのうちの何番目かを
指定して反転表示させたいのですがよくわかりません。




>>162
そうですか。
>>162
答えはヘルプファイルにあります
165デフォルトの名無しさん:02/02/03 18:30
あの、InternetExplorerでプラグインとして使えるActiveXをVC++で作るにはどうすればいいんですか?
166デフォルトの名無しさん:02/02/03 18:31
>>165
InternetExplorer.hをインクルードする
167デフォルトの名無しさん:02/02/03 18:39
fatal error C1083: インクルード ファイルがオープンできません。'InternetExplorer.h': No such file or directory
>>168
include/InternetExplorer.hをインクルードする
169デフォルトの名無しさん:02/02/03 19:48
atal error C1083: インクルード ファイルがオープンできません。'include/InternetExplorer.h': No such file or directory
170デフォルトの名無しさん:02/02/03 19:49
インクルードって、リンクファイルじゃなくてIncludeですか?
みっともないのでネタはやめてくださいね
172デフォルトの名無しさん:02/02/03 20:02
あの、上の方の冗談(?)はとにかく本当に #include "include/InternetExplorer.h"でファイルオープン不可のエラーが出るのですが…。
まずそんなファイルがあるかどうかPC内検索してみろよ
>>173
次に MSDN ライブラリを BHO で検索だな。
175デフォルトの名無しさん:02/02/03 20:21
ないです…。VC++以外のものをインストールする必要があるんすか?
176152:02/02/03 21:52
>>153
お答えくださってありがとうございます。
177デフォルトの名無しさん:02/02/03 22:03
Unixかなんか向けに作られたプログラムをVCでコンパイルしようとすると
#include <sys/time.h>をオープンできませんってエラーが出ます。
その他に
struct timeval start, end; や
gettimeofday(&start,0);
random()
の行のところで定義されてないのを使っているとエラーが出ます。
VCでそういうのが定義されているヘッダファイルとライブラリはないのですか?
プログラムの実行時間を計るために使われている(randomは違うけど)は分かるけど
具体的にどうしたらいいか分かりません。
お願いします。
178デフォルトの名無しさん:02/02/03 22:10
>165
まず、COMというものの知識をつけてください。
その後、VC++を起動し、新規作成→プロジェクト→ATM Com App Wizard→銀行→ATM→(゜Д゜)ウマー
OS依存の部分を
すべてなおすナリ
VC++を起動し、新規作成→プロジェクト→KFC AppWizard(exe)→ドラゴンツイスター頼む→(゜Д゜)ウマー
VC++を起動し、新規作成→プロジェクト→MFC AppWizard(exe)→CVSup→make world→signal11でへくった(゜Д゜)マズー
182login:Penguin:02/02/04 21:35
イベントで
Becky2を起動して
特定のアドレスに
メールを送信する
というプログラムを書きたいのですが、
アドバイスお願いします。
>>182
どっかで見たことあるよな・・・マルチ?
どうでもいいけどどんなアドバイスがほしいのか書けよアフォ。こちとらエスパーじゃねーんだからさ。
全部とか言うなよ。
184デフォルトの名無しさん:02/02/04 23:20
すいません。
クラスでの関数ポインタ配列について教えて下さい。

================================
class testClass{
private:
  void (*pArFunc[2])(); //関数ポインタ配列
public:
  void Func();
  void Func0();
  void Func1();
};
void testClass::Func(){
  void (testClass::*pArFunc)()  = Func0; //OK...@
  void (testClass::*(pArFunc+1))() = Func1; //駄目...A
}
void testClass::Func0(){}
void testClass::Func1(){}
================================

上の@のコンパイルが大丈夫だったので、Aを試したのですが、
"構文エラー : ')' が '<tag>::*' の前に必要です"
というエラーが出てしまいます。
クラスで関数ポインタ配列を使用する場合はどうしたら良いのでしょうか?

[section]
aa=あいうえお
bb=かきくけこ
cc=さしすせそ

GetPrivateProfileStringの2番目の引数(Key)にNullを指定すると
GetPri(略)で指定したbufにKeyが全て入ってくるとヘルプファイルに書かれているのですが、
=より後ろ(あいうえお)等の文字列はどこへいってしまうのでしょう?

あと、全てのkeyとそれに対応するStringを検索して表示させたいのですが、
何かいい関数はないでしょうか?

できれば例も、、、




keyを貰ったんなら、それをつかって、
GetPriv...を回せばいいのでは?
>184
ずいぶん邪悪なキャストですね....

class testClass{
private:
void (testClass::*pArFunc[2])(); //関数ポインタ配列
public:
void Func();
void Func0(){}
void Func1(){}
};
void testClass::Func(){
*(pArFunc+0) = Func0;
*(pArFunc+1) = Func1;
}
188デフォルトの名無しさん:02/02/04 23:52
標準ライブラリを使いたくないのですが
va_list
va_start
va_end
の代わりにになるWin32Apiってあるんですか?
VC++では、va_*はマクロです。
ちゃんとヘッダを覗きましょう。
そして、APIで実現されようがないことを
理解しましょう。
190デフォルトの名無しさん:02/02/05 00:33
クラスをエクスポートしたと思われるDLLを無理矢理使う方法知ってるひといませんか?
ダンプしたのはこんな感じ

00001090 1 0000 ??0audioRemCon@@QAE@XZ
00001160 2 0001 ??1audioRemCon@@UAE@XZ
000030F8 3 0002 ??_7audioRemCon@@6B@
000012E0 4 0003 ?CloseAudioCtlDriver@audioRemCon@@QAEXXZ
000011C0 5 0004 ?GetAudioCtlDriverName@audioRemCon@@QAEHXZ

あと名前変形はいったいどういう規則で行われてるのやら……
自分でaudioRemConクラスの定義を捏造、ダミーメソッドでexport。
尚、メンバ変数は、char dummy[2000]などで代用しておくこと。
それと、メソッドの型情報は自力で復元すること。

できあがったlibを使用して、リンク。元のdllを使用。
192184:02/02/05 00:44
>>187様様
コンパイルできました。
ありがとうございます。
助かりました。
193デフォルトの名無しさん:02/02/05 00:54
>>189
ありがとうございます。
もう1つひつもんなのですが
vsprintf等は標準関数?みたいなのですが
これはLIBCをLINKしなくても良いのでしょうか?
vsprintfは標準関数。
WIN32APIならwvsprintf使え。
195185:02/02/05 06:46
keyはわからない状態で検索しないといけないんです。
196デフォルトの名無しさん:02/02/05 07:32
Here are fill of silly.
197185:02/02/05 07:32
>>186
すんません。
実は検索したキーの入り方がよくわからないんです。
198デフォルトの名無しさん:02/02/05 08:48
>>194
ありがとうごさいます。
好きです。大好きです。
199デフォルトの名無しさん:02/02/05 11:29
わらをもすがる思いです。どなたか教えてください。
ドキュメント/ビューアーキテクチャで、ドキュメントの方にメッセージを
飛ばしたいんですが、できるんでしょうか?メニューからは飛んでくるので
できると思うんですが。ウィンドウハンドルはどうやってとったらいいんでしょう?
200デフォルトの名無しさん:02/02/05 12:16
>>199
普通はViewにメッセージが飛んできて、
それをドキュメントにつたえるという形になると思うが...