ディレクトリ名からファイル名の最後までを
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用の関数にすればよいのではないかと想像するのですが、
そこが原因であれば、代わりにどういう関数を使えば良いのでしょうか?
ディレクトリ名とファイル名の間に\を入れたいので、
それもできる関数は、何を使えば良いんだろう?と、つまづいています。
不足情報が有れば、お伝えください。
どうぞよろしくお願いします。
System.IO.Pathあたりを扱えばよいのでは?
(GetCurrentDirectory相当もありますし。)
String^ dir = System::IO::Directory::GetCurrentDirectory();
String^ file = Path::Combine(dir, L"a001.txt");
wsprintf改めswprintfではいかがでしょ。
>Blueさん
ありがとうございます。
GetCurrentDirectoryに関してなのですが、
引数を設定しないとエラーが出ます。
わたしの持っている逆引きにも引数無しのサンプルコードが載っているのですが、
msdnには引数を二つ用意するよう書いてあります。
ひとまず引数を2つ設定すればエラーは消えるので、それで記述してます。
引数無しでコンパイルが通らないのはなぜなのでしょうか。
書き方の初歩的な質問かもしれません、すみません。
>επιστημηさん
swprintfでうまくいきました。
ありがとうございます
>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
*****************ソースここまで*********************
すみません、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
・
・
・
*****************ソースここまで*********************
System::IO::Directory::GetCurrentDirectory()の代わりに
System::Environment::CurrentDirectoryを使うとか。
>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 );
******************************************************************
何か良い方法、もしくは定石みたいなものは有るのでしょうか?
お知恵をかしてください。
> 現在行き詰っているところは、引数にchar型を使うために、
> swprintfでは要求している型が違うためエラーが出てしまいます。
wchar_t 使えば?
# わけもわからず闇雲に書きなぐってる雰囲気...
# 教えてもらうのはいいけれど、鵜呑みにせず納得づくで使ってくださいね
ちゅうか、String::Formatで良いのでは?
パスの編集であれば、System::IO::Pathを使うのが普通でしょうけど。
(フォルダ名にファイル名をくっつけたり、ファイル名に拡張子をくっつけたりする箇所。
ファイル名を作るのはFormatで。)
ツイート | ![]() |