C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: fixedでstringからchar*を取得すると1文字に?


(過去ログ 94 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■56197 / inTopicNo.1)  fixedでstringからchar*を取得すると1文字に?
  
□投稿者/ BBKids (1回)-(2011/01/04(Tue) 19:56:50)

分類:[C#] 

初めて質問させていただきます。

C言語で書かれた自作のDLLをC#から呼び出すため、
以下のようなプログラムを書きました。

unsafe class Dll
{
   [DllImport("hoge.dll")]
        public static extern int createFile(char* path, char* data);
}

public object foo(string bar, params string[] baz)
{
   object ret = "";

    unsafe
    {
        fixed (char* path = args[0], texts=args[1])
        {
          Dll.createFile(path,texts);
        }
    }
    ret = "Success";
    return ret;
}

DLLの第1引数はファイルパス、第2引数はファイルに書き込む内容です。
これを実行すると、DLLの呼び出し自体は成功しているのですが、
処理結果を見ると、引数の先頭文字しかDLLに渡っておりません。
具体的には、
args[0]に"hogehoge.csv",args[1]に"a,b,c,d"を設定すると、
aという内容のhというファイルが作られる、という現象です。
おそらく基本的なことを理解していないために、おかしなプログラムを
書いているのだと思いますが、この後何を調べてよいのかわからず、
行き詰ってしまいました。
原因や解決策への道しるべなど、ご教示いただけば幸いでごさいます。
何卒よろしくお願いいたします。

[環境]
Windows XP,Visual Studio 2008(C++/C#),.NET Framework 3.5


引用返信 編集キー/
■56198 / inTopicNo.2)  Re[1]: fixedでstringからchar*を取得すると1文字に?
□投稿者/ Azulean (668回)-(2011/01/04(Tue) 20:00:26)
2011/01/04(Tue) 20:00:35 編集(投稿者)
単純に以下のように書いたらだめなんでしょうか。

unsafe class Dll
{
  [DllImport("hoge.dll")]
  public static extern int createFile(string path, string data);
}

public object foo(string bar, params string[] baz)
{
  Dll.createFile(args[0], args[1]);
  return "Success";
}

引用返信 編集キー/
■56199 / inTopicNo.3)  Re[2]: fixedでstringからchar*を取得すると1文字に?
□投稿者/ BBKids (2回)-(2011/01/04(Tue) 20:27:20)
Azulean様

返信ありがとうございます。
ご指摘のように、string型をそのまま渡すことで、意図した通りに動きました。

DLL側のコード(関数の宣言)は、
extern "C" __declspec(dllexport) int createEmptyFile(char* path, char* data)
のようになっておりまして、以下のURLなどを参考にしながら、string型からchar*への
何らかの変換が必要だと考えておりましたが、必要はなかったのですね。
http://msdn.microsoft.com/ja-jp/library/aa288474(VS.71).aspx

fixedの動作などキチンと理解が出来ておらず、私はまだ修行が足りてないようですが、
おかげさまで直面していた問題は解決しましたので、解決済みとさせていただきます。

ありがとうございました。

No56198 (Azulean さん) に返信
> 2011/01/04(Tue) 20:00:35 編集(投稿者)
>
> 単純に以下のように書いたらだめなんでしょうか。
>
> unsafe class Dll
> {
> [DllImport("hoge.dll")]
> public static extern int createFile(string path, string data);
> }
>
> public object foo(string bar, params string[] baz)
> {
> Dll.createFile(args[0], args[1]);
> return "Success";
> }
>
解決済み
引用返信 編集キー/
■56221 / inTopicNo.4)  Re[3]: fixedでstringからchar*を取得すると1文字に?
□投稿者/ よねKEN (654回)-(2011/01/05(Wed) 10:36:37)
No56199 (BBKids さん) に返信
> fixedの動作などキチンと理解が出来ておらず、私はまだ修行が足りてないようですが、
> おかげさまで直面していた問題は解決しましたので、解決済みとさせていただきます。

私はC#でunsafeとかそっちの関連についてはやったこともありませんので、
こうすればできますよ、と即座にはアドバイスできないのですが、
今回の間違いは、C言語のchar* と.NET FrameworkのSystem.Stringの
文字コードと文字列の取り扱いの違いを認識していない点だと思います。

char*で扱う文字列はASCII(SJIS)の文字列です。
.NET FrameworkのStringは内部データはUNICODEです。

"hogehoge.csv"という文字列はUNICODEでは16進数で「68 00 6F 00 …」(68 00の部分がh)というデータの並びになります。
これをそのままchar*に渡せば、68 = h、00 = ヌル文字と解釈され、6F以降のデータはないのと同じ扱いになり、

> aという内容のhというファイルが作られる、という現象です。

という現象になります。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -