2005年05月07日
川俣晶の縁側ソフトウェア技術雑記total 9966 count

C++/CLIでネイティブな文字列とmanagedな文字列を相互変換する「試行」その1

Written By: 川俣 晶連絡先

 画廊亭32bit版で、昔からあるネイティブなソースと、これから追加するmanagedなコードを混在させてみたいので、混在ソースを実際に書いてみました。

 完全に把握するまで待つのではなく、何となく見えてきた時点でソースを書いてみています。これぞ「身体を動かせ! Body First主義!!」

 内容は、特に気になる文字列の相互変換です。ネイティブな文字列をmanagedな文字列に変換して処理し、それをネイティブな文字列戻してみます。

 以下は、「試行」のその1ということで、もっと上手い方法があるであろうということを把握した上でまずは力業で書いてみたものです。

サンプルソース §

 Visual C++ Express 2005 Beta2で、managedコンソールアプリケーションのテンプレートでプロジェクト作成後に、以下のソースを入力します。

#include "stdafx.h"

// あえてprintfを使うのincludeしておく

#include <stdio.h>

using namespace System;

// ここからはネイティブコードにしてちょ

#pragma unmanaged

// printfでcharのポインタで受けた文字列を出力するネイティブコード関数

void unmanagedOutput(const char * str)

{

    printf("native string: %s\n",str);

}

// いかにも古き良きCらしいコーディングで文字列を生成するネイティブコード関数

// むろん、以下の関数はバッファオーバーランの可能性がある悪い関数である

void unmanagedCreateString(char * str)

{

    // 要するにアルファベット大文字A~Zの生成

    for( int i=0; i<26; i++ )

    {

        *str++ = 'A' + i;

    }

    *str = '\0';

}

// ここからはmanagedコードに戻してちょ

#pragma managed

// managedコードで文字列を加工する関数。小文字にしてみる

String ^ managedModefyString( String ^ str )

{

    return str->ToLower();

}

int main(array<System::String ^> ^args)

{

    // 入れ物になる配列。マジックナンバー27はお行儀が悪いぞ!

    char test[27];

    // ネイティブコード関数で配列に文字列をセットさせる

    unmanagedCreateString(test);

    // managedコードで文字列を加工する

    // char配列からSystem::Stringに直すのは、

    // System::Stringのコンストラクタに任せればおしまい

    String ^ result = managedModefyString( gcnew String(test) );

    // あえてSystem::Stringの文字列をシフトJISの文字列に戻してもらう

    // 結果はunsigned char型のmanagedな配列になる

    array<unsigned char> ^ arrayResult = System::Text::Encoding::GetEncoding("Shift_JIS")->GetBytes(result);

    // charの配列に中身をコピー

    char * nativeResult = new char[arrayResult->Length+1];

    for( int i=0; i<arrayResult->Length; i++ )

    {

        nativeResult[i] = arrayResult[i];

    }

    nativeResult[arrayResult->Length] = '\0';

    // ネイティブコード関数から結果を出力

    unmanagedOutput(nativeResult);

    // おっと、後始末を忘れちゃいけません!

    delete nativeResult;

    // おしまい

    return 0;

}

実行結果 §

native string: abcdefghijklmnopqrstuvwxyz

感想 §

 勝手知ったるC++と勝手知ったる.NET Frameworkクラスライブラリであるはずなのに、微妙に苦労が絶えません。すりあわせ部分の整合性が綺麗に噛み合っていない感じです。しかし、すりあわせそのものは難しい処理ではないので、汎用ライブラリ化も容易でしょう。たぶん、マーシャリング関係にそういう便利な機能も揃っているに違いないと考えて、もうちょっとスマートに書けないか試行を続けてみましょう。

Facebook

このサイト内の関連コンテンツ リスト

2005年
05月
08日
C++/CLIでネイティブな文字列とmanagedな文字列を相互変換する「試行」その2
3days 0 count
total 19058 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20050507003443
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.