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
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 型の変数を初期化してから渡します。
回答ありがとうございます
No.2の回答で解決しました。
関数がLPSTRの引数で
内部でstd::stringで処理をし
戻り値としてLPSTRを返したかったのです
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 で処理して云々」とあるから、こういうことじゃないんだろうなぁ。よくわかりませんでした、すみません^^
No.1
- 回答日時:
ご利用の VB と C++ 間で、「正式な言語間のインターフェイスが定義されていて、VB の string と C++ の std::string の変換方法もあるはずだが、探しても見つけられなかった」という前提でのご質問ならいいですが^^;
そうではなくて、言語間のインターフェイスが規定されていないなら、std::string などの表現は実装依存ですから、シンプルな型の char * で渡すのがいいのではないですか?(シンプルな型の char * でも、C・C++ ⇔ Fortran で関数を呼び合う場合、文字列長の引数などの指定方法が処理系依存だったような。。。 大域変数で渡すほうが移植性があるのかも^^)。
他に代替方法があるなら、正式サポートのない複数言語の混合使用は、できれば、やめたほうがいいのではないでしょうか?^^;
この回答への補足
今回はdll内部での話しで
C++内でcharからstd::stringへの変換ほうほうということです
わかりにくくてすみません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
std::map の const 修飾について
-
snprintfが使用できない。
-
opencvを使って画像比較
-
JPEGやPNGが読めるLoadImage関数
-
空ENTERの判別
-
switch文のエラーについて
-
CStdioFile での数値データの読...
-
2重の(?)の#include
-
C++型変換について
-
#include "fstream.h"
-
std::vectorのメモリ管理を自分...
-
_tcscat がうまくいきません(V...
-
VC++2010 EE で #ifdef _MSC_VE...
-
VC++で文字列から任意の文字を...
-
構文エラーが出ているのですが...
-
vectorの中にmap
-
gccでコンパイル時のエラー
-
std::lower_boundについて
-
std::wstringのメモリリークに...
-
C++ 数値データファイルから2次...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
なぜ、C++の標準ヘッダをインク...
-
gccでコンパイル時のエラー
-
空ENTERの判別
-
【C++】ヘッダ内でstringを格納...
-
snprintfが使用できない。
-
enumの値から定義名を文字列化...
-
#include "fstream.h"
-
C++で、テキストファイルを一行...
-
std::wstringのメモリリークに...
-
C++での <iostream.h>と<iostre...
-
VC++で文字列から任意の文字を...
-
#defineの使い方について
-
wstringの主力
-
vc++の使い方について
-
std::map の const 修飾について
-
string型のフォーマット書式指...
-
構造体配列のvectorへの変換と...
-
指定した文字を削除したい
おすすめ情報