none
在PDA上,如何用c#去抓取,用c寫好的字串 RRS feed

  • 問題

  •  

    在我的c code部分,有一個function如下,

    char *TempMessage;

    char * MySipCommand( )

    {

    TempMessage="test\r\n";

    return TempMessage;

    }

     

    我將c編譯成dll檔…

     

    用c# 來引用

     

    [DllImport("..\\My.dll")]
            public static extern string MySipCommand( );

     

    string testmessage;

    testmessage=MySipCommand( );

     

    它不能獲得c的字串…能否請教各位…有什麼好方法嗎??在PDA上…

    2008年5月19日 下午 02:41

解答

  •  

     

    試了好一下子,直接給答案:

     

    C++ 裡面:

    TCHAR g_awcMessage[] = L"Hello中文";
    char g_aszMessage[] = "Hello中文";

    extern "C" __declspec(dllexport) TCHAR* __stdcall GetHelloL()

     return g_awcMessage; 
    }

    extern "C" __declspec(dllexport) CHAR* __stdcall GetHello()

     return g_aszMessage;
    }

    extern "C" __declspec(dllexport) int __stdcall GetInt()

     return 100;
    }

     

    C# 裡面:

    [DllImport("gpDll.dll")]
    public static extern IntPtr GetHello();

    [DllImport("gpDll.dll")]
    public static extern IntPtr GetHelloL();

    [DllImport("gpDll.dll")]
    public static extern int GetInt();

     

    private void button1_Click(object sender, EventArgs e)
    {
                // Not support in CF
                //Marshal.PtrToStringAnsi
                //Marshal.PtrToStringAuto

     

                // Multibytes 會變成亂碼
                string str =  Marshal.PtrToStringUni(GetHello());

     

                // Wide Character 顯示正常
                string strL = Marshal.PtrToStringUni(GetHelloL());

     

                int n = GetInt();
    }

     

    由於 CF 沒有支援程式碼中的註解,所以若想要取得 Multibytes 的字元得要另外轉換。

    2008年5月21日 上午 09:00

所有回覆

  • 嗨!

    試試看這個!

    Code Snippet

    testmessage = Convert.ToString(MySipCommand( ));

     

     

    2008年5月20日 上午 02:29
  •  

    感謝你的回應…但是還是不行…

     

    怎麼那麼奇怪呢??

     

    老天爺啊…為什麼???

    2008年5月20日 上午 03:40
  •  

     

    試了好一下子,直接給答案:

     

    C++ 裡面:

    TCHAR g_awcMessage[] = L"Hello中文";
    char g_aszMessage[] = "Hello中文";

    extern "C" __declspec(dllexport) TCHAR* __stdcall GetHelloL()

     return g_awcMessage; 
    }

    extern "C" __declspec(dllexport) CHAR* __stdcall GetHello()

     return g_aszMessage;
    }

    extern "C" __declspec(dllexport) int __stdcall GetInt()

     return 100;
    }

     

    C# 裡面:

    [DllImport("gpDll.dll")]
    public static extern IntPtr GetHello();

    [DllImport("gpDll.dll")]
    public static extern IntPtr GetHelloL();

    [DllImport("gpDll.dll")]
    public static extern int GetInt();

     

    private void button1_Click(object sender, EventArgs e)
    {
                // Not support in CF
                //Marshal.PtrToStringAnsi
                //Marshal.PtrToStringAuto

     

                // Multibytes 會變成亂碼
                string str =  Marshal.PtrToStringUni(GetHello());

     

                // Wide Character 顯示正常
                string strL = Marshal.PtrToStringUni(GetHelloL());

     

                int n = GetInt();
    }

     

    由於 CF 沒有支援程式碼中的註解,所以若想要取得 Multibytes 的字元得要另外轉換。

    2008年5月21日 上午 09:00
  •  

    請問一下…你是用PDA試的嗎??我是有用PDA來試…它並不能…
    2008年5月21日 下午 12:41
  • 敝人用的是 PDA 的模擬器來跑,

    不過看到您的問題又用機器測一次,

    結果當然是正確的,

    這種東西不太可能跟實機有差異,

    程式放在下面網址,有需要可自行下載偵錯看看 (gpTest.sln)。

     

    http://www.8cases.com/download/gpDllNet.rar

    2008年5月21日 下午 12:57
  • 真的非常的感謝你…TCHAR確實可以用…假設我要用

     

    char g_aszMessage[] = "Hello中文";

     

    來回傳至c#…有什麼方法能正確的解讀…因為我的C CODE…

     

    是用VC 6.0來寫的…再用EVC來做成DLL檔…所以我才一直要用char *…

     

    麻煩了…感謝…

     

    2008年5月21日 下午 02:43
  • 兩種解決的方式

    1. C# 實作先前程式碼中註解的功能。

     

    但是上面方法不建議,因為 CE 預設都是使用寬字元在進行轉換,

    所以建議使用:

    2. C 程式碼傳遞給 C# 時,Multibytes character (CHAR*) 轉換為 Wide character (TCHAR*)

     

    這樣程式碼要寫就只要如下:

     

    TCHAR* foo ()

    {

      char sz[] = "Hello";

      return 轉換函式(sz);

    }

     

    轉換函式怎麼做?請查 mbstowcs 或 MultiByteToWideChar 之類的 API 就可以達成了。

    2008年5月22日 上午 01:42
  •  

    謝謝你…我過幾天再試試…現在在用其它的地方…
    2008年5月22日 上午 10:59
  • 我還是不會用…所以我只好把所有的c code用c#…再寫一篇…

     

     

    不過還是謝謝你…

    2008年6月4日 上午 01:08