0

私は C 用の SQLite を使用しています。UTF-8 Chars を C# アプリから .dll に送信しようとしていますが、毎回動作が異なります。たとえば、「değirmenci」を追加することもあれば、同じコードで「değirmencil」を追加することもありますが、単語は変更しません。また、UNIQUE列に同じものを追加することもあります(charがあると思いますが、ASCIIの0x01のように表示されません)私の英語について申し訳ありません。

これは私の c# コードです。

    [DllImport("dllfile.dll", CharSet = CharSet.Unicode)]

static void Main()
{
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes("değirmenci");
    int r;
    //
    IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length);
    Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length);

    IntPtr ch = Tahmin_Baslat();

    r = Sozcuk_Ekle(unmanagedPointer);
    Console.WriteLine(r);
    Console.Read();
    //
}

これは私のCコードです

    int Sozcuk_Ekle(const char* kok,int tip_1=1,int tip_2=0,int tip_3=0)
{
    sqlite3 *ch; 
    int rc; 
    char *HataMsj = 0; 

    rc = sqlite3_open(veritabani, &ch); // Veritabanının açılması

    if( rc )
    {
        return HATA_DEGERI;
    }

    char buff[strlen(kok) + 64];
    sprintf(buff,"INSERT INTO kokler (kok,tip_1,tip_2,tip_3) VALUES('%s',%d,%d,%d)",kok,tip_1,tip_2,tip_3); // Verilerin Birleştirilmesi
    sqlite3_exec(ch,buff,GeriBildirim,0,&HataMsj); // Komutun Yürütülmesi
    sqlite3_close(ch); // Veritabanını kaynaklarının serbest bırakılması
    return DOGRU_DEGERI; // Doğru Dönder
}

(ヘッダファイル等含む

解決策
バイトの末尾に NULL ターミネータを追加します。byte[] bytes = System.Text.Encoding.UTF8.GetBytes("değirmenci\0"); このような。

4

1 に答える 1

1

DllImport属性の呼び出し規約を確認してください ( Cdeclである必要があります)。そして、UTF-8 文字列に NULL ターミネータを追加します。

byte[] bytes = System.Text.Encoding.UTF8.GetBytes("değirmenci" + '\0');

これにより、結果の UTF-8 文字列に NULL ターミネータが追加されます(ネイティブ .NET 文字列には必要ありません)。

于 2012-12-14T20:19:41.880 に答える