C++関数のパラメタの変更方法

このQ&Aのポイント
  • C++の関数AddFileにおいて、パラメタの値を変数から参照する方法を教えてください。
  • 関数AddFileはLPCWSTR型のパラメタを受け取るため、文字列のポインタを引数にとる関数としては扱えません。
  • 同じ要領でパラメタの値を変数から参照しようとするとエラーが発生します。どのように書けばよいでしょうか。
回答を見る
  • ベストアンサー

関数のパラメタ(C++)

HRESULT AddFile( LPCWSTR pRemoteName, LPCWSTR pLocalName ); というメソッドがあり、 「LPCWSTR」はmapidefs.hの中で typedef const WCHAR FAR * LPCWSTR; と定義されています。 この関数を AddFile(L"http://172.0.0.1/index.htm","c:\\tmp\\index.htm"); ※\\は正しい。 のように呼ぶ場合は成功するのですが、 パラメタの値をいったん格納した変数を参照するように変更したい場合、 どのように書けばよいでしょうか。 文字列のポインタを引数にとる関数であれば、 aaa("zzz"); あるいは char str[256]="zzz"; aaa(str); のように書けばよいことはわかっていますが 同じ要領でやろうとするとこの場合エラーになってしまいます。

質問者が選んだベストアンサー

  • ベストアンサー
noname#15691
noname#15691
回答No.3

>実際のファイル名は固定ではなく、mainの引数なり環境設定ファイルの読み込みなりで動的に取得したいのです。 >以下のソースで、10行目はOKなのに、11,12行目を生かすとNG(INVALIDパラメタ)になります。 >7,8行目のデバッグ文を見る限り、文字列は正しいように思え、原因がわかりません。 ああ、それでわかりました。 AddFileの引数はWCHAR(ワイドキャラクタ)のポインタで、AddFileToJobの引数はcharのポインタですよね。 WCHARは2バイト系のコード(Unicode)で、charは1バイト系(Shift-JIS)のコードなので、単にLPCWSTRでキャストしてもポインタを変換しているに過ぎず、コードを変換しているわけではありません。 ですから、コードを変換してから関数を使うように、 WCHAR pServerURL[500]; WCHAR pClientFileName[500]; MultiByteToWideChar(CP_ACP, 0, ServerURL, -1, pServerURL, 500); MultiByteToWideChar(CP_ACP, 0, ClientFileName, -1, pClientFileName, 500); hr = pJob->AddFile(pServerURL, pClientFileName); と、しなければなりません。

yumi-mika
質問者

お礼

詳しい解説ありがとうございました。 確認できました。

その他の回答 (2)

noname#15691
noname#15691
回答No.2

LPCWSTR s1 = L"http://172.0.0.1/index.htm"; LPCWSTR s2 = L"c:\\tmp\\index.htm"; AddFile(s1, s2);

yumi-mika
質問者

補足

説明が適切でなくてすみません。 実際のファイル名は固定ではなく、mainの引数なり環境設定ファイルの読み込みなりで動的に取得したいのです。 以下のソースで、10行目はOKなのに、11,12行目を生かすとNG(INVALIDパラメタ)になります。 7,8行目のデバッグ文を見る限り、文字列は正しいように思え、原因がわかりません。 1:bool AddFileToJob(char *ServerURL, char *ClientFileName) 2:{ 3: bool bRet = false; 4: LPCWSTR pServerURL=(LPCWSTR)ServerURL; 5: LPCWSTR pClientFileName=(LPCWSTR)ClientFileName; 6: 7: printf("[%s]\n",ServerURL); 8: printf("[%s]\n",ClientFileName); 9: 10: hr = pJob->AddFile(L"http://172.29.226.101/index.htm", L"c:\\tmp\\index.htm"); //OK 11:// hr = pJob->AddFile((LPCWSTR)ServerURL, (LPCWSTR)ClientFileName); //NG 12:// hr = pJob->AddFile(pServerURL, pClientFileName); //NG 13: 14: if (SUCCEEDED(hr)) 15: { 16: bRet = true; 17: } 18: return bRet; 19:}

  • kmb01
  • ベストアンサー率45% (63/138)
回答No.1

WCHAR s0[100] = L"http://172.0.0.1/index.htm"; WCHAR s1[100] = L"c:\\tmp\\index.htm"; HRESULT ret = AddFile(s0, s1); でいいと思います。

関連するQ&A

  • VBからVCDLLへのtypedefパラメータの渡し方

    [VS2005 XP] お世話になります。 VCで作成したDLLをVBから呼び出したいのですが VC側 typedef unsigned int KTY[16];/*固定長配列*/ void AAA(const int Len, const unsigned char *str, KTY k){/*第三パラメータ k*/ ---- } VB側現在 <DllImport("***.dll")> _ Public Shared Sub AAA( _ ByVal Len As Integer, _ ByVal str As String, _ ByRef k() As UInt32) End Sub Dim kk() As UInt32 = Nothing Dim c As String = "1234567890" AAA(10, c, kk) ------- 第三パラメータをVC側で埋めて返してくれるはずなのですがNothingのままです。 typedefで固定長配列に宣言された値を取り出すにはどうしたらよいのでしょうか? VCは本日ソースを渡されただけで初めて触ります。 よろしくお願いいたします。

  • MFC C++ と C++/CLI の文字列

    VS2008です。 Library: NativeC++ with MFC -> DLL   ↑↓ Wrapper: C++/CLI with .NET -> DLL   ↑↓ Appli: VB.NET with .NET -> EXE 元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう 移植をしています。 Library から必要な関数を dllexport し、wrapper から参照し、 wrapper を Appli が参照して、使用できるようにしました。 int型を引数に取り、結果として返す関数は期待どおり動作しますが、 文字列だと上手く行きません。 Wrapper/Appli は System.CString で統一したいのですが、 Library ではどのような型として宣言すれば文字列のやり取りができるでしょうか。 ( 引数・戻値の両者 ) CString wchar_t* char* System.String ALT::CStringT basic_string _bstr_t CComBSTR LPCTSTR LPTSTR PCTSTR PTSTR LPCWSTR LPWSTR PCWSTR PWSTR BSTR… なお、Library で下記のようにエクスポートし __declspec(dllexport) BSTR test(LPCTSTR data); wrapper で BSTR hoge(LPCTSTR value){ return test(value); } と宣言すると、wrapperのビルドで下記のエラーが表示されます。 エラー 1 error LNK2028: 未解決のトークン (0A000B39) "wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が 関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)" (?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。 wrapper.obj wrapper エラー 2 error LNK2019: 未解決の外部シンボル "wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が 関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)" (?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。 wrapper.obj wrapper エラー 3 fatal error LNK1120: 外部参照 2 が未解決です。

  • 以下のようなメタ関数を定義してもpower<10L,10L>の結果はl

    以下のようなメタ関数を定義してもpower<10L,10L>の結果はlongでなくintで 計算されたような値となってしまいます. これは何故でしょうか? 使用しているコンパイラはgcc4.1.2です. template<long Base, long Index> struct power { typedef long value_type; static const value_type base = Base; static const value_type index = Index; typedef power<base, index> type; static const value_type value = base * power<base, index - 1L>::type::value; }; template<long Base> struct power<Base, 0L> { typedef long value_type; static const value_type base = Base; static const value_type index = 0; typedef power<base, index> type; static const value_type value = 1L; };

  • C++のstringstreamについて

    こんにちは。 C++のstringstreamについて教えてください。 stringstreamはbasic_stringstream<char, char_traits<char>,allocator<char> >がtypedefされたもので、他にbasic_stringstream<wchar_t, char_traits<wchar_t>,allocator<wchar_t> >というwstringstreamというものも存在していますよね。 同じtemplateクラスに異なるパラメータを渡しているというのはわかるのですが、stringstreamとwstringstreamでは内部実装は異なるものだと思っています。 たとえばwchar_tの場合、文字列に数字などを入れる場合、swprintfという関数を使用しますよね。 同様にcharの場合は、文字列に数字などを入れる場合、sprintfという関数を使用することになるかと思います。 basic_stringstreamクラスはこの関数の切り分けはどのように実現させているのでしょうか? 私は関数のオーバーロード(sprintfとswprintfを同じ名前でラップ)か、クラスの特殊化程度しか思いつきませんでした。 char_traitsが魔法の種のような気がするのですがいまいちよくわかりません。 よろしければご教授願います。 /* 開発環境はVisualStudio2008 academic editionです。 */

  • 関数をプロパティとして代入する際

    認識が合っているかどうか怪しいのですが、 関数をプロパティで代入する際の引数についての質問ですー。 簡単なサンプルですが、ルート直下にaaaと出力する関数trを定義し、 ルートのマウスダウンに当てます。 _root.onMouseDown=tr; function tr() { trace("aaa"); } この場合はきちんと"aaa"と出力されるのですが、 下記のようにtrに引数を持たせた場合、 プロパティとしてマウスダウンに当てることは可能なのでしょうか? function tr(str:String){ trace(str); } ↓ _root.onMouseDown= ??? 下記のように普通にfunctionから呼び出すしかないのでしょうか? _root.onMouseDown=function(){ tr("aaa"); } 宜しくお願いします。

  • 関数ポインタについて

    関数ポインタを使用する際に、 指定する先の関数でデフォルト引数が指定されている場合、 関数ポインタを用いて、その引数を省略して呼び出すことはできるのでしょうか? 以下例とします。 void function(int a = 10){}; typedef void (*test)(int a); test a = &function; a(); //このように呼び出したい

  • C言語のint型の配列が分かりません

    #include<stdio.h> int main(void) { int str[ ]={0,1,2} printf("%s\n", str); return 0; } というプログラムをC言語でつくってみましたが動きません.(012と表示されて欲しかったのですが) int str[ ]={1,2,3}の部分をchar str[ ]={'0','1','2'}とすれば動きます. そこで質問なのですが, printf("~%s~", (配列名));  はchar型の配列にしか適応できないのですか? ※追記 puts関数の定義は int puts (const char *str); であるそうなので char型の仮引数にはchar型のアドレスを渡さなければいけません. ではprintf関数の定義は一体どんなものなのですか?

  • 構造体へのポインタ

    typedef struct str_tmp_t{ int a; char b; } str_tmp; void main() { str_tmp *str_info; str_info->a = 1; } とした場合、コンパイルエラーは出てはいないのですが、数値を代入している個所で落ちてしまいます。 これを回避するには単純にmallocしてfreeすれば良いのでしょうか? よろしくお願い致します。

  • Form内関数のパラメタについて VB6.0

    現在、他人の作成したVBプログラムを解析しているのですが、 どなたかご存知でしたらご教授願います。 画面の初期表示時の処理(Form_Load)内でPrivate Subで関数処理を 行っています。 仮にaaaという名称だった場合、 Private Sub From_Load() … aaa (0) End Sub とした時に、実際のaaa側は Public Sub aaa(Optional Mode As Integer=-1, Optional Index As Integer=-1) … End Sub とあった場合、Form_Load内でaaaに渡している(0)の値は、 "aaa側の第1パラメタであるModeに0を渡している" と言う解釈で合っていますか? また、この時のIndexパラメタには-1が設定されていると言う解釈で 合ってますでしょうか? VBはあまり良くわからずに悪戦苦闘しています。 すみませんがよろしくお願いします。

  • C言語の標準関数の引数の順番について

    C言語標準関数の引数についての質問です。 strcpy、memsetなど C言語の標準関数の引数に注目したところ 前に出力パラメータを持ってきているものが多いように思えます。 例えば、 char *strcpy(char *dest, const char *src); の場合、 第1引数の"dest"が出力パラメータで 第2引数の"src"が入力パラメータとなっています。 入力よりも出力を前に持ってきている理由が何かあるのでしょうか。 今後、自分が設計をするときの参考にしたいと考えているので 理由を知っている方がいたら教えて下さい。

専門家に質問してみよう