C#C ++のdll可変長バイトまたは文字char *ポインタを受け取ります

     ほとんど常にネットワーク上のデータの受信した文字(バイト)のサイズを知るために予め固定見つけ、今、次のように知っている必要がないデータの大きさ

アイデア:

1 .C ++、受信C位に可変長バイトポインタまたはアドレスを返し、C#のデータ長にアドレスを返します。

 2 .C#、C ++、バイト[]長さ作成されたデータを受信し、データの長さによって返されます。

 3.C#が、読み出しデータのアドレスを返すことでコピーします。

 

 

C ++コードを次のように: 

 

extern  " C "       __declspec(DLLEXPORT)    CHAR   * GetFileByteArray(* BinfilePathのwchar_t、* BinfileName、wchar_tのINT INDEXFILE、INT * 長さ)
 { 

       
     CHAR * chBinfilePath = nullptr、* chBinfileName = nullptr。
     wchar_tTranstoChar(BinfilePath、 chBinfilePath)。
     wchar_tTranstoChar(BinfileName、 chBinfileName)。

     char型 [] = " 13345zh中文こんにちは" // 前提条件需要返回变长的指针
     INT   FILECOUNT = はsizeof ()。
        
     CHAR  ATT = * 新しい新しい CHAR [FILECOUNT]; 
     のmemcpy(ATT、A、FILECOUNT);

      * = FILECOUNT長1; // 取得したC#の長さ

     フリー(chBinfilePath)を、
      フリー(chBinfileName); 
    
     リターン   ATT; // 取得したC#のポインタ
    
 }

 

次のようにC#の処理です。 

        [DLLIMPORT(" BASECORELIBRARY.dll "、項目CharSet = CharSet.Unicode、CallingConvention = CallingConvention.StdCall)]
         パブリック 静的 にexternのIntPtr GetFileByteArray(文字列 BinfilePath、ストリング BinfileName、INT INDEXFILE、REF   INT 長さ)




 INT長さ= 0 
          
            IntPtr piBuf = InvokeDLL.GetFileByteArray(newFilePath、toBinName、0REF の長さ)。
            
            バイト [] arrayBuf = 新しい バイト[長さ]。 
            Marshal.Copy(piBuf、arrayBuf、0 、長さ)。

            文字列 ST =   Encoding.Default.GetString(arrayBuf)。
            Console.WriteLineを(ST);

 

出力: 13345zh中国こんにちは            

 

おすすめ

転載: www.cnblogs.com/bkyrslf/p/12077637.html