iniファイル 取得について

解決


超初心者  2009-09-29 01:14:26  No: 70993

毎度お世話になります。

今回質問させていただきたいことは、CLRにおいてのiniファイルの取得についてです。

[DB_INFO]
SERVER_NAME=2003R2
DB_NAME=aaa
ID=aaa
PASS=aaa

こういうiniファイルがあった時、SERVER_NAME=〜  DB_NAME=〜

とピンポイントにそれぞれの値を取得するにはどうすればいいのでしょうか?

どうぞよろしくお願い致します。


オショウ  2009-09-29 02:27:35  No: 70994

GetPrivateProfileString を調べてみてください

iniファイルの所在によっては
GetProfileString になります。

以上。参考まで・・・


超初心者  2009-09-29 02:39:43  No: 70995

オショウさんさっそくの回答ありがとうございます。

GetPrivateProfileStringについて、さっそく調べさせて頂きます。

ちなみに、iniファイルは実行するexeと同じ場所に置くという事です。

また分からないことがあったら質問すると思いますが、そのときは宜しくお願い致します。


tetrapod  2009-09-29 02:43:53  No: 70996

> ちなみに、iniファイルは実行するexeと同じ場所に置くという事です。
その ini ファイルはインストール時に書いて実行中には書き換えないなら OK だけど
実行中に書き換えようとするなら Vista の UAC ではまるから注意。

要仕様変更だと思う。


超初心者  2009-09-29 03:23:04  No: 70997

tetrapodさんお世話になります。

>ini ファイルはインストール時に書いて実行中には書き換えないなら OK 

はい、実行中は書き換えは行わないです。

GetPrivateProfileStringについて調べて見たのですが、c++/cli  で扱うにはどうすればいいのでしょうか?

どこか参考になるサイトなどを知っていましたら、教えて頂けると助かります><


オショウ  2009-09-29 03:55:06  No: 70998

http://www13.ocn.ne.jp/~kancha/progmemo3.html#k3-4-1

ここなんか如何?

※  C++ CLIを選択した理由は?

以上。


超初心者  2009-09-29 04:02:21  No: 70999

オショウさんお世話になります。

>※  C++ CLIを選択した理由は

こういう仕様でつくるように言われているのです・・・・・・。

僕自身、C++ CLIは初めてで全くちんぷんかんぷんで・・・><

GetPrivateProfileStringを使うにあたって、そのままではつかえないですよね?なにかインクルードしないといけないのでしょうか?


オショウ  2009-09-29 05:28:55  No: 71000

http://msdn.microsoft.com/ja-jp/library/cc429779.aspx

ここの最下部に記載があります。

ちゃんとヘルプ読めば書いてありますヨ!

以上。


Blue  2009-09-29 18:36:52  No: 71001

インクルードとかリンクするのが面倒なら.NETっぽくDllImportで書いてみるとか。

using namespace System;
using namespace System::Text;
using namespace System::IO;
using namespace System::Reflection;
using namespace System::Runtime::InteropServices;

[DllImport("kernel32.dll")]
UInt32 GetPrivateProfileString(String^ lpAppName, String^ lpKeyName, String^ lpDefault, StringBuilder^ lpReturnedString, UInt32 nSize, String^ lpFileName);

int main(array<System::String ^> ^args)
{
    String^ path = Path::Combine(Path::GetDirectoryName(Assembly::GetEntryAssembly()->Location), L"test.ini");

    StringBuilder^ sb = gcnew StringBuilder(1024);
    UInt32 ret = GetPrivateProfileString(L"DB_INFO", L"SERVER_NAME", L"default", sb, sb->Capacity, path);
    System::Console::WriteLine(sb->ToString());

    return 0;
}

windows.hのインクードとkernel32.libをリンクする方法。

#include "windows.h"
#pragma comment(lib, "kernel32.lib") // オプションで指定可

#include "vcclr.h"

using namespace System;
using namespace System::IO;
using namespace System::Reflection;

int main(array<System::String ^> ^args)
{
    String^ path = Path::Combine(Path::GetDirectoryName(Assembly::GetEntryAssembly()->Location), L"test.ini");
    pin_ptr<const wchar_t> pin_path = PtrToStringChars(path);
    
    wchar_t buff[1024];
    DWORD ret = ::GetPrivateProfileStringW(L"DB_INFO", L"SERVER_NAME", L"default", buff, _countof(buff), pin_path);
    System::Console::WriteLine(%String(buff));

    return 0;
}

参考
過去ログの自分の発言より
>ついでに、Win32 API を使うには
>・#include <windows.h> を適当なところに記述する
>・プロジェクトのプロパティから
>  リンカ→入力→追加の依存ファイル に適切な lib を追加する
>  (基本的に「親またはプロジェクトの規定値からの継承」をチェックすればOK)
>  ※ #pragam comment( lib, "〜〜〜.lib" ) でもOK

・#include <windows.h> を適当なところに記述する
は正しくは
#include "windows.h" ですね。


超初心者  2009-09-29 23:28:14  No: 71002

オショウさん、Blueさん毎度お世話になります。

>オショウさん

もう少し注意して読んでみます^^ありがとうございました。

>Blueさん

具体的な例をあげていただいて本当にありがとうございます。こういう書き方もあるのですね〜。
お教えいただいた事を参考に実現できそうです^^

本当にありがとうございました^^


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加