質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

994閲覧

c++ iniファイルで取得した文字列をMessageBeepメソッドの引数に指定したい

konan1234

総合スコア7

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/12/18 09:10

C++でiniファイルの文字列を取得し、取得した文字列をMessageBeepメソッドの引数に指定したいです。
GetPrivateProfileStringメソッドを使って、iniファイルの値は取得できたのですが、MessageBeepメソッドの引数に指定するとエラーが発生してしまいます。解決策が分からないです。お力を貸してください。

・iniファイルの中身(test.ini)
[test]
sound = MB_ICONHAND

■C++(test.cpp)
・iniファイルの取得処理
// 変数
TCHAR ret[MAX_PATH]
// testiniファイルの値を取得
GetPrivateProfileString(TEXT("test"),TEXT("sound"),TEXT("取得失敗"),ret,sizeof(ret),TEXT"c\test.ini" ));
⇒retにMB_ICONHANDが格納される。この変数をMessageBeepの引数に指定

// MessageBeep
MessageBeep(ret);
⇒retの引数は型"UINT"のパラメータと互換性がないエラーが発生したので以下に修正

MessageBeep(int(ret));
⇒コンパイルは出来たが違う音が出る。

恐らく、MB_ICONHANDをint型に指定してもMessageBeep(MB_ICONHAND);になっていないと思っています。
ちなみにMessageBeep(MB_ICONHAND);※MB_ICONHANDは固定値で試したところ、上手く行っているのは確認しております。
iniファイルの値を取得してもTCHARの配列のため、[0]M,[1]B,[2]_,[3]I…となっており混乱しております。

iniファイルの値を取得後、何か処理が必要なのでしょうか。
何か解決策があれば教えてください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

iniファイルから文字列で "MB_ICONHAND" を取得するわけですね。MB_ICONHANDはマクロで定義されているUINT型リテラルです。

つまり、文字列→UINT型への変換が必要になります。
お手軽にやるなら、下記イメージです。

C++

1#include <iostream> 2#include <map> 3#include <string> 4 5std::map<std::wstring, UINT> MessageBeepType = 6{ 7 {L"MB_OK", MB_OK}, 8 {L"MB_ICONHAND", MB_ICONHAND}, 9 {L"MB_ICONQUESTION", MB_ICONQUESTION}, 10 {L"MB_ICONEXCLAMATION", MB_ICONEXCLAMATION}, 11 {L"MB_ICONASTERISK", MB_ICONASTERISK} 12}; 13 14int main() 15{ 16 // retへiniファイルから読み出し 17 MessageBeep(MessageBeepType[ret])18}

Windowsではコンパイルしてないのでエラーがでたらごめんなさい。

投稿2017/12/18 10:47

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

konan1234

2017/12/19 01:15

返信ありがとうございます。 私が使用しているはC++10のため、この方法ではできないのがわかりました。 ※教えていただいたのはC++11から可能みたいです。
Chironian

2017/12/19 02:48

その通りですね。 ところで、C++11の前はC++03ですので2003年に規定されています。C++10という規格はありません。もしかして、お使いのコンパイラがVisual C++ 2010という意味でしょうか? サンプルのstd::mapの初期化がC++03では書けない筈です。 しかし、std::map自体はC++のかなり初期からありますし、回答のポイントはstd::mapを使って変換すれば楽ですよという内容です。初期化方法にこだわる必要はありません。 C++の初期からあるinsertで積んでいけば良ですよ。 ↓Windowsではないですが、必要なスタブを定義して確認してみました。 https://wandbox.org/permlink/KDWzzZ9m7vCMLaZm でも、古いVisual C++は規格への準拠がぬるいと聞きますので、そこは心配ですね。
konan1234

2017/12/19 05:08

返信ありがとうございます。 使用しているコンパイラはおっしゃるとおり、Visula C++ 2010です。 mapの定義、要素の追加は教えていただいた通り、成功しました。ありがとうございます。 後は GetPrivateProfileStringメソッドを使用して取得したiniファイルの文字列を以下のようにしたのですがエラーが出て上手くいきません ・GetPrivateProfileStringメソッドの第4引数の変数をwchar_t ret[]に格納 TCHAR ini[MAX_PATH]; GetPrivateProFileString("セクション","カラム","読み込み失敗", ini, sizeof(ini), "test.ini"); wchar_t ret[] = ini; MessageBeep(MessageBeepType[ret]); ↓以下のエラーが発生 ・error C2440:初期化中 TCHAR[]からwchar_t[]に変換できない ・集約オブジェクトには{…}での初期化が必要 GetPrivateProfileStringで取得したiniファイルの文字列をどうすればMessageBeepの引数にしてできるでしょうか。何度も申し訳ないです。
konan1234

2017/12/19 05:30

GetPrivateProfileStringメソッドを使用して取得したiniファイルの文字列の型はconst char型なので 加工ができないという認識であっておりますでしょうか。
episteme

2017/12/19 05:47 編集

あなた int a[10]; int b[] = a; とか書きますフツー?
Chironian

2017/12/19 06:27

そのTCHAR配列のiniをそのまま渡せる筈なのですが、もしかして、文字セットとしてUnicodeではなくマルチバイトを使ってますか? (Unicodeの場合TCHARはwchar_tと定義されており、マルチバイトの時はcharと定義されています。) マルチバイトの場合は、wchart_t → char、std::wstring → std::string、L"xxx" → "xxx" と書けば良いです。 なお、TEXT()やTCHAR的な手法でUnicodeとマルチバイトの両者を共通で書く方法もあるかもしれません。(そちらは把握していないです。マイクロソフト独自なので他で通用しませんし、私はnarrow文字列しかサポートしないような制御用ライブラリをよく使うのですが、その時パニックになるので。) > wchar_t ret[] = ini; でエラーがでるのは上記問題とは無関係です。epistemeさんが言っている通り、単純にC++文法違反です。
konan1234

2017/12/19 07:33

Chironianさん 回答ありがとうございます。おかげさまで実現したいことが出来ました。 本当に助かりました。ありがとうございました。
guest

0

使うべきはGetPrivateProfileStringではなくGetPrivateProfileIntでは?

投稿2017/12/18 09:55

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問