.NETでwsprintfと同じ働きをする関数を記述したい


yumiko  2009-02-04 23:16:13  No: 69594

ディレクトリ名からファイル名の最後までを
char型配列で取得しようとしています。(VC++/CLR)
例えば
”D:\Documents and Settings\X\My Documents\memo\a001.txt”
といった感じに。
以下のように記述したのですがエラーがでてしまい試行錯誤しています。

【エラー内容】
error LNK2020: 未解決のトークン (0A000292) "extern "C" int __cdecl wsprintfW(wchar_t *,wchar_t const *,...)" (?wsprintfW@@$$J0YAHPA_WPB_WZZ)

*****************ソースここから*********************

#define F001  "a001.txt"  

private: System::Void btn_Click(System::Object^  sender, System::EventArgs^  e) {
    
    LPWSTR  LPW_Dir  = 0;  //ディレクトリ名
    LPWSTR  LPW_file = 0;  //ファイル名
    char  file[260];
      
    GetCurrentDirectory( 256, LPW_Dir );    //カレントディレクトリ名をPWSTR文字列で取得
    wsprintf( LPW_file, L"%s\\%s", LPW_Dir, F001 );// "ディレクトリ名\ファイル名"  の文字列を配列"file"に取得
    DXconvWideToAnsi( file, LPW_file, 260 );//取得したユニコード文字列をマルチバイトのキャラ配列に変換する関数
              //変数fileにchar型配列として代入される。
    Proc_Sendfax( file );
}

*****************ソースここまで*********************

知識不足で上記のエラーがどういったものなのか分かりません。
検討違いかもしれませんが、原因はwsprintfではないかと思っています。
結果的に、変数"file"をchar型配列で取得できれば、途中の方法は問わないため、
wsprintf関数を使わず、.NET用の関数にすればよいのではないかと想像するのですが、
そこが原因であれば、代わりにどういう関数を使えば良いのでしょうか?
ディレクトリ名とファイル名の間に\を入れたいので、
それもできる関数は、何を使えば良いんだろう?と、つまづいています。

不足情報が有れば、お伝えください。
どうぞよろしくお願いします。


Blue  2009-02-04 23:24:18  No: 69595

System.IO.Pathあたりを扱えばよいのでは?
(GetCurrentDirectory相当もありますし。)

String^ dir = System::IO::Directory::GetCurrentDirectory();
String^ file = Path::Combine(dir, L"a001.txt");


επιστημη  URL  2009-02-04 23:26:59  No: 69596

wsprintf改めswprintfではいかがでしょ。


yumiko  2009-02-07 01:59:59  No: 69597

>Blueさん
ありがとうございます。

GetCurrentDirectoryに関してなのですが、
引数を設定しないとエラーが出ます。
わたしの持っている逆引きにも引数無しのサンプルコードが載っているのですが、
msdnには引数を二つ用意するよう書いてあります。
ひとまず引数を2つ設定すればエラーは消えるので、それで記述してます。
引数無しでコンパイルが通らないのはなぜなのでしょうか。
書き方の初歩的な質問かもしれません、すみません。

>επιστημηさん
swprintfでうまくいきました。
ありがとうございます


Blue  2009-02-07 02:05:10  No: 69598

http://social.msdn.microsoft.com/forums/ja-JP/vcgeneralja/thread/a2c9c7cc-1441-4ce3-bfdf-bdfaa0810d37/
ですか?


*yumiko*  2009-02-09 23:38:38  No: 69599

>BLUEさん
大変参考になりました。助かりました。
参考URLの最後に記載されているコードの記述場所ですが、
setCurrentDirectoryの記述を参考にして記入しました。
初心者のためシステムをいじるのが不安なのですが、
記載箇所は以下の場所で合っていますでしょうか?

*****************ソースここから*********************
WINBASEAPI
DWORD
WINAPI
GetCurrentDirectoryA(
    __in DWORD nBufferLength,
    __out_ecount_part_opt(nBufferLength, return + 1) LPSTR lpBuffer
    );
WINBASEAPI
DWORD
WINAPI
GetCurrentDirectoryW(
    __in DWORD nBufferLength,
    __out_ecount_part_opt(nBufferLength, return + 1) LPWSTR lpBuffer
    );
#ifdef UNICODE
#define GetCurrentDirectory  GetCurrentDirectoryW
#else
#define GetCurrentDirectory  GetCurrentDirectoryA
#endif // !UNICODE

//★★★ここに追記でOKでしょうか???★★★

#if _WIN32_WINNT >= 0x0502

*****************ソースここまで*********************


*yumiko*  2009-02-09 23:47:38  No: 69600

すみません、1行下でした。
修正後↓ソースを載せます。

*****************ソースここから*********************
WINBASEAPI
DWORD
WINAPI
GetCurrentDirectoryA(
    __in DWORD nBufferLength,
    __out_ecount_part_opt(nBufferLength, return + 1) LPSTR lpBuffer
    );
WINBASEAPI
DWORD
WINAPI
GetCurrentDirectoryW(
    __in DWORD nBufferLength,
    __out_ecount_part_opt(nBufferLength, return + 1) LPWSTR lpBuffer
    );
#ifdef UNICODE
#define GetCurrentDirectory  GetCurrentDirectoryW
#else
#define GetCurrentDirectory  GetCurrentDirectoryA
#endif // !UNICODE

#if _WIN32_WINNT >= 0x0502

//★★★ここに追記で、コンパイルは通りました★★★

WINBASEAPI
BOOL
WINAPI
SetDllDirectoryA(
    __in_opt LPCSTR lpPathName
    );
WINBASEAPI
BOOL
WINAPI
SetDllDirectoryW(
    __in_opt LPCWSTR lpPathName
  
      ・
      ・
      ・
*****************ソースここまで*********************


subaru  2009-02-10 01:19:57  No: 69601

System::IO::Directory::GetCurrentDirectory()の代わりに
System::Environment::CurrentDirectoryを使うとか。


*yumiko*  2009-02-11 00:13:26  No: 69602

>subaruさん
別の方法を教えていただきありがとうございます。
やってみす。

>String^ file = Path::Combine(dir, L"a001.txt");

3つ以上の文字列を結合したいのですが、どうすれば良いでしょうか?
d=a+b+cとしたいので、Path.Combineメソッドを使って、a+b=d、c+d=eと、
ひとまずこのように記述していますが、
もう少し便利な関数をどなたかご存知でしたら教えてください。
(最初に質問したケースはPath::Combine(dir, L"\\a001.txt");とすれば
Path.Combineメソッドで良さそうです。)

というのも、一番上に載せたソースでは、下記のように引数がLPWSTRだったため、
教えて頂いたswprintfを使うことができました。
**************************************************
LPWSTR  LPW_Dir  = 0;
LPWSTR  LPW_file = 0;
swprintf( LPW_file, L"%s\\%s", LPW_Dir, F001 );
**************************************************

現在行き詰っているところは、引数にchar型を使うために、
swprintfでは要求している型が違うためエラーが出てしまいます。
*****************************************************************
char X[30];
char a[5];
char b[5];
int c[5];
#define  F ".txt"
swprintf( X[ch], "%s%s%d%s", a, b, c, F );
******************************************************************

何か良い方法、もしくは定石みたいなものは有るのでしょうか?
お知恵をかしてください。


επιστημη  URL  2009-02-11 00:21:50  No: 69603

> 現在行き詰っているところは、引数にchar型を使うために、
> swprintfでは要求している型が違うためエラーが出てしまいます。

wchar_t 使えば?

# わけもわからず闇雲に書きなぐってる雰囲気...
# 教えてもらうのはいいけれど、鵜呑みにせず納得づくで使ってくださいね


Blue  2009-02-11 02:26:23  No: 69604

ちゅうか、String::Formatで良いのでは?

パスの編集であれば、System::IO::Pathを使うのが普通でしょうけど。
(フォルダ名にファイル名をくっつけたり、ファイル名に拡張子をくっつけたりする箇所。
ファイル名を作るのはFormatで。)


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

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






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