• ベストアンサー

C++型変換について

C++を始めたばかりの初心者です VBからstringの引数をもらって C++のdllで処理をしてstringを返すものを考えています dll内で処理をするのにstd::stringに変換したいのですが 変換ほうほうがわかりません charをstd::stringへ std::stringをcharへの変換方法を教えてください 宜しくお願いします。

  • mo_gu
  • お礼率85% (6/7)

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

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

ん?dll 内の関数が引数型として、std::string 型のものを持っていて、char * の内容の std::string 型をその関数の引数として渡したいということですか?? C++ 内では、 '\0' で終わっている char * を渡せば、std::string への型変換が自動的に働くからそのまま渡せばいいのでは?あるいは、std::string の変数を char * で初期化して渡してもいいですけど。 #include <string> #include <iostream> #include <cstring> void func(const std::string &s) { std::cout << s << '\n'; } void funcp(const char *p) { std::cout << p << '\n'; } int main() { char *cstr = "hoge"; func(cstr); // char * をそのまま渡す std::string s(cstr); func(s); // char * で std::string を初期化して渡す std::string t; t = cstr; // char * を std::string に代入して渡す func(t); funcp(s.c_str()); // s の "hoge" を渡す char *q = std::strcpy(new char[s.size() + 1], s.c_str()); // 領域を確保して "hoge" を得る funcp(q); delete[] q; } ===== > ./a.exe hoge hoge hoge hoge hoge

mo_gu
質問者

お礼

ありがとうございます 変換することが出来ました。

その他の回答 (3)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.4

知りたいことがまったく別のことで、回答が的外れかもしれませんが、一応、「関数が引数型として、std::string 型のものを持っていて、…」のところをきちんと言っておくと^^; たとえば、 void func1(const std::string &s) { ... } void func2(std::string s) { ... } void func3(std::string &s) { ... } で、func1() と func2() の引数型なら、'\0' でおわっている char * をそのままわたせます。func3 は std::string 型を渡さないといけないので、char * で std::string 型の変数を初期化してから渡します。

mo_gu
質問者

お礼

回答ありがとうございます No.2の回答で解決しました。 関数がLPSTRの引数で 内部でstd::stringで処理をし 戻り値としてLPSTRを返したかったのです

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

char * ではなく、char なら、 char c = 'a'; std::string s(&c, 1); std::string t; // char で初期化できないが、代入はできる t = c; if (!s.empty()) c = s[0]; // s の最初の文字を得る とかしておけばいいですけど。質問は、「dll で処理して云々」とあるから、こういうことじゃないんだろうなぁ。よくわかりませんでした、すみません^^

mo_gu
質問者

お礼

回答ありがとうございます。 No.2の回答で解決しました。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.1

ご利用の VB と C++ 間で、「正式な言語間のインターフェイスが定義されていて、VB の string と C++ の std::string の変換方法もあるはずだが、探しても見つけられなかった」という前提でのご質問ならいいですが^^; そうではなくて、言語間のインターフェイスが規定されていないなら、std::string などの表現は実装依存ですから、シンプルな型の char * で渡すのがいいのではないですか?(シンプルな型の char * でも、C・C++ ⇔ Fortran で関数を呼び合う場合、文字列長の引数などの指定方法が処理系依存だったような。。。 大域変数で渡すほうが移植性があるのかも^^)。 他に代替方法があるなら、正式サポートのない複数言語の混合使用は、できれば、やめたほうがいいのではないでしょうか?^^;

mo_gu
質問者

補足

今回はdll内部での話しで C++内でcharからstd::stringへの変換ほうほうということです わかりにくくてすみません

関連するQ&A

  • C++型変換

    型変換が難しいです。 デバッグやフォームへ文字を表示するのに型変換で躓いています。 charからstringとやBYTEからstringなど相互変換の需要はあまりないのでしょうか? char2stirngとか一式どこかにないですか? そもそもMicrosoftがこう言った型変換を簡単にするのを提供しないのはなぜでしょう? VBはあまり意識せずできていたので、VBからするとメッセージボックスに文字や数字を出すだけでも一苦労です。

  • string型とsbyte*型の変換

    現在、C++で作成したクラスを、 C#から呼び出し実行しようとしております。 C++側での引数のデータ型は、「char *」 、 C#側での引数は、「sbyte*」となっています。 このクラスに対し、C#側から文字列をC++側に渡したい場合、 string型からsbyte*型へ変換しなければならないと 考えているのですが、その方法がわかりません。 そもそもの考え方が正しいのかどうかもわからない状態ですので、 質問そのものがとんちんかんなことを聞いているのかも知れませんが、 どうぞよろしくお願いいたします。

  • unsigned char SJis[2]からstd::stringに変換

    開発環境は VC++ 2008 Express Edition あるDLLの関数で戻り値としてShiftJISの1文字が格納された unsigned char SJis[2] が返され,これを呼び出し側のプログラムで使っている文字列 std::string str に順に追加していこうと思っています. そこで, unsigned char tmpSJis[3]; tmpSJis[0] = SJis[0]; tmpSJis[1] = SJis[1]; tmpSJis[2] = '\0'; str += std::string(tmpCode); というコードを書いてループさせたのですが, error C2440: '<function-style-cast>' : 'unsigned char *' から 'std::string' に変換できません。 というエラーが出てしまいうまく変換できません. これを解決する方法はありませんか?

  • VBからCで作成されたDLLへの引数の渡し方

    VBからCで作成されたAPI関数への引数の渡し方がわかりません。 C側の引数のデータ型はchar型でポインタ渡しではありません。 ------------------------------------------------ C側 int KANSU(char Mode) VB側 Public Declare Function KANSU Lib "USERAPI.dll" ( ByVal CHAR As Byte) As Long ------------------------------------------------ C側がポインタ渡しの場合は、VB側はSTRING型で別に悩むことはなかったのですが、文字列渡しの場合は、VB側はBYTE型で渡す必要があり、その方法がわかりません。 どなたか、分かる方よろしくお願いします。 ちなみに、VB6.0です。

  • C++DLLからC#へのコールバックに文字列の配列を渡したい

    教えてください! C++のアンマネージドDLLから、複数のファイル名(文字列)をC#に渡したいです。 ステップとしては、 C#から、C++のDLLの関数を最初に呼んで、コールバック関数を渡しています。 次に、DLLからコールバック関数を呼ぶ時に、複数のファイル名を渡したいです。 以下のコードを動かすと、、 C++からは2つ渡しているつもりなのに、 C#ではfilesがサイズ1のString配列として引数に入ってきます。 なぜでしょう? またどうすればC#から複数受け取れるでしょうか? 教えてください! C# public delegate int StringArrayCallback(String[] files); // C# -> C++ public static int start() { StringArrayCallback cb = new StringArrayCallback(onReceivedFiles); int ret = start(cb); return ret; } // C++ -> C# callback public static int onReceivedFiles(String[] files) { return 1; } C++コード typedef int (__stdcall *OnReceivedFilesProc )(char**); int start( OnReceivedFilesProc callback ) { std::string message1_ = "from C++1"; std::string message2_ = "from C++2"; char* messages_[2] = { (char*)message1_.c_str(), (char*)message2_.c_str() }; int ret_ = callback(messages_); std::cout << "[from c#]" << ret_; }

  • 型変換

    こんにちは。 long型およびunsigned long型を unsigned char型へ変換する方法を教えてください。 例えば、long型をchar型へ変換するには sprintf(pchar, "%s", &longvalue); で可能だと思いますが、冒頭の変換は sprintfだと1番目の引数の型が違うようで うまくいきません。 よろしくお願いします。

  • Delphiの型変換

    わけあって、Array of charとStringを相互に変換したいのですが、方法はありますでしょうか。 stringは1文字なのですが、charとの変換がどうしても上手くいきません。 よろしくお願いします。 x : string; y : array [0..79] of char; x := 'A'; y[0] := x; みたいなコトをしたいのですが・・・。

  • C++について

    C++の独学初心者です 仕様書?やエラーの見方が全くわかりません 例えば vscodeにてreverse()の関数の説明を見ると以下のような仕様書というのでしょうか?ものが見れますが 私はここからわかるのは返り値がvoidであるということぐらいがだいたい想像できるだけです これはどの様に見れば良いのでしょうか? 解説している様なサイトがあれば教えてください void std::__1::reverse<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>::iterator>(std::__1::__wrap_iter<...> __first, std::__1::__wrap_iter<...> __last) よろしくお願いします

  • 型変換方法について

    困っています。。 下記コードは文字コードのチェックをしているのですが、チェックする文字コードを直接指定するのではなく、 String code = "0x2460" のように持たせておきたいのですが、この文字列を使ってチェックするにはどうしたらよいでしょうか? char型に変換しないといけないと思うのですが変換方法が分かりません。 API等いろいろ調べてみたのですが分かりませんでした。 どうか宜しくお願いします。 コード---------------------------------------- public class CodeCheck {  public static void main(String[] args) {   String str = "a"; // チェック対象文字   char ch = str.charAt(0);   if(ch == 0x2460) {    // エラー処理   } else {    // 正常処理   }  } } ---------------------------------------------

    • ベストアンサー
    • Java
  • VC++ std::stringからLPCWSTRに変換

    Visual C++ 2008を使用してTextBoxからの値(System::String)をmciSendString(LPCWSTR)に渡したいと思っています。 そこで自分はSystem::Stringをstd::stringに変換しそれから渡そうと思っているのですが・・・ 『error C2664: 'mciSendStringW' : 1 番目の引数を 'std::string' から 'LPCWSTR' に変換できません。』 のようにエラーが出ます。 当然そのまま与えてるので出るのは当たり前なのですが、キャストや変換の仕方が分からず調べ様にも困っている次第です。 C++に今回始めての挑戦で、右も左も分からないのですが、もしよろしければご指南頂けませんでしょうか?

専門家に質問してみよう