• ベストアンサー

string型とsbyte*型の変換

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

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

  • ベストアンサー
  • sygh
  • ベストアンサー率76% (42/55)
回答No.1

「C++」というのは「C++/CLI」のことですか? 処理系がVC 2005以降だと仮定して話を進めます。 例えば下記のようなC++/CLIの参照クラスを含むクラス ライブラリ プロジェクト「CppCliString」があったとして、 // CppCliString.h #pragma once #include <cstdio> #include <locale.h> #include <vcclr.h> // http://support.microsoft.com/kb/311259/ja using namespace System; using namespace System::Runtime::InteropServices; namespace CppCliString { public ref class Class1 { public: static void SetLocaleW() { _wsetlocale(LC_ALL, L""); } static void PutsA(char* pStr) { puts(__FUNCTION__ "(), Ansi Version:"); puts(pStr); } static void PutsW(wchar_t* pStr) { _putws(__FUNCTIONW__ L"(), Unicode Version:"); _putws(pStr); } static void WriteLineA(String^ hStr) { puts(__FUNCTION__ "(), Ansi Version:"); // ディープ コピー発生。 IntPtr ptr = Marshal::StringToHGlobalAnsi(hStr); puts((char*)(void*)ptr); Marshal::FreeHGlobal(ptr); } static void WriteLineW(String^ hStr) { _putws(__FUNCTIONW__ L"(), Unicode Version:"); // ディープ コピー発生。 IntPtr ptr = Marshal::StringToHGlobalUni(hStr); _putws((wchar_t*)(void*)ptr); Marshal::FreeHGlobal(ptr); } }; } C#側は下記。 // Program.cs using System; using System.Runtime.InteropServices; namespace CsStringTest { class Program { static void Main(string[] args) { Console.WriteLine("Managed/Unmanaged String Test"); string strText = "hoge文字列ソースhoge"; CppCliString.Class1.SetLocaleW(); // unsafe ステートメントはお勧めしません。 unsafe { fixed (char* pStr = strText) { // コピーは発生しない。 CppCliString.Class1.PutsW(pStr); } { // ディープ コピー発生。 IntPtr ptr = Marshal.StringToHGlobalUni(strText); CppCliString.Class1.PutsW((char*)ptr); Marshal.FreeHGlobal(ptr); } { // ディープ コピー発生。 IntPtr ptr = Marshal.StringToHGlobalAnsi(strText); CppCliString.Class1.PutsA((sbyte*)ptr); Marshal.FreeHGlobal(ptr); } } // こちらを推奨。というかそのために C++/CLI が存在する。 CppCliString.Class1.WriteLineW(strText); CppCliString.Class1.WriteLineA(strText); Console.WriteLine("Press any..."); Console.ReadKey(true); } } } C#側のプロジェクト プロパティで「アンセーフ コードの許可」にチェックを入れて、 C++/CLI側のターゲットがWin32の場合、C#側もターゲットをx86にする。 でも、C#でunsafeとかポインタを使うのはやめたほうがいいです。

関連するQ&A

  • char型とstring型について

    char型とstring型について質問があります。 言語はC++です。 以下の関数があったとします。 void test(string a, string b string c){ 処理 } この関数を下記のように利用した場合について質問があります。 a.引数に直接文字列を挿入したケース test("aaa","bbb","ccc") b.変数に文字列を設定し、変数を引数にしたケース string a="aaa" string b="bbb" string c="ccc" test(a,b,c) (1)はコンパイルエラーになり、(2)は成功しました。 同じ様に見えるのですが、何が違うのでしょうか? また、関数の引数の型をchar*にした場合、(1)(2)のケースでコンパイルが通りました。char*型だと何が違うのでしょうか?

  • C++型変換

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

  • VC String型のエンディアン変換

    お世話になります String型の文字列のそれぞれの文字(一文字ずつ)の エンディアンを変更したいのですが、簡単な方法はないでしょうか? 今考えている方法は Stringから一文字ずつcharに入れ込んで このcharをシフトとマスクで入れ替える方法なのですが ((val<<8) & 0xff00) | ((val>>8) & 0x00ff) エンディアン変換の前後でString⇒charとchar⇒Stringを行うので、 少し煩雑になるのが気になっております。 型変換無しでエンディアン変換できないでしょうか

  • C++型変換について

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

  • Stringとは一体何だ?

    Stringは型なのでしょうか?それともクラスなのでしょうか? Stringは参照型の型で、クラスを表す、つまり文字列を表す参照型の型であり文字列を表すクラスでしょうか?説明が悪くてごめんなさい。Java歴二週間です。

    • ベストアンサー
    • Java
  • Stringのフォーマットの変換方法(Java)

    Java実行時の引数として渡した14桁の数値(文字列)を、 ----- yyyy-mm-dd hh:mm:ss ----- の形式にフォーマット変換したいです。 (日時のように書いてますが、型はDateやTimestampではなくStringのままでもOK) 文字列をsubstringメソッドで区切って、 その後に「-」や「:」と+で文字列連結させる方法も考えたのですが、 そのようにせずにもう少しシンプルに変換する方法はありませんでしょうか?

    • ベストアンサー
    • Java
  • System::String->char*変換でき

    C++/CLIでSystem::String^文字列をchar*に変換する関数を書いたのですが、256文字以上の文字列を投げて、戻値を確認してみると、255文字分しか中身が詰まっていません。元の文字列はアスキーのみです。 #include <msclr/marshal.h> using namespace msclr::interop; static char* toPtChar(const String^ Text) { String^ temp = (String^)Text; msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context(); char* res = ((char*)(context->marshal_as<const char*>(temp))); return res; } この関数をどのように変更すれば、256文字以上変換できるでしょうか?

  • Delphiの型変換について

    DelphiでParadoxにテーブルを作成するツールを 作ろうとしています。 TFieldType型のftStringを文字列'ftString'に 変換してString型の2次元配列にいれたいのですが、 うまくいきません。 String型にキャストしようとしても 「正しくない型キャスト」とエラーが出てしまいます。 どうすれば、TFieldType型をString型に 変換できるのでしょうか。 Paradoxを使ったことのある方、ご教授お願いします。

  • 型変換

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

  • String文字列を16進数のint型に変換

    String^ test = Wireless_ID_str02[i]->s_rssi; このtestには"1c"という文字列が入っているのですが、この文字をint型の int rssi_dec = ****** この中に入れたいのですが、方法はないでしょうか? ちなみに、 rssi_dec = strtol(test, &endptr, 16); こんなことをやってみたのですが、こんなエラーがでました。 error C2664: 'strtol' : 1 番目の引数を 'System::String ^' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 使用可能なユーザー定義された変換演算子がない、または 1> マネージ型をアンマネージ型に変換できません。 どうぞ、よろしくお願い致します。

専門家に質問してみよう