託管函式和非託管函式如何互相傳遞ansi字串?

2021-09-24 19:03:26 字數 1561 閱讀 5241

先來介紹兩個預處理指令:

#pragma unmanaged

#pragma managed

這兩個預處理指令,控制函式編譯成託管函式,還是非託管函式。是函式級別的預控制指令。

1. 託管函式傳送字串給非託管函式

分三步走

a.先呼叫stringtohglobalansi將string轉換成intptr型別變數,(intptr是net framework用於表示指標或控制代碼的平台特定型別。) 這個轉換過程就是將託管 string 中的內容複製到非託管記憶體,並在複製時轉換為 ansi 格式。此處,並不是將託管記憶體傳遞出來,而是,在非託管堆中分配記憶體並返回位址。所以,這塊記憶體需要自己釋放。

b.通過topointer方法將intptr例項的值轉換為指向未指定的型別的指標(void *)。

c.使用完後呼叫freehglobal 釋放a步中的非託管記憶體。

看乙個完整的例子:

//

marshalansi1.cpp

//compile with: /clr

#include 

<

iostream

>

#include 

<

stdio.h

>

using

namespace

std;

using

namespace

system;

using

namespace

system::runtime::interopservices;

#pragma unmanaged

void

nativetakesastring(

const

char

*p) 

#pragma managed

intmain() 

2. 非託管函式傳遞字串給託管函式

這個簡單的多了。只需要呼叫marshal::ptrtostringansi把傳統的c字串轉換成託管字串即可。

例子://

marshalansi2.cpp

//compile with: /clr

#include 

<

iostream

>

#include 

<

vcclr.h

>

using

namespace

std;

using

namespace

system;

using

namespace

system::runtime::interopservices;

#pragma managed

void

managedstringfunc(

char

*s) '

", ms);

}#pragma unmanaged

void

nativeprovidesastring() 

#pragma managed

intmain() 

託管函式和非託管函式如何互相傳遞ansi字串?

先來介紹兩個預處理指令 pragma unmanaged pragma managed 這兩個預處理指令,控制函式編譯成託管函式,還是非託管函式。是函式級別的預控制指令。1.託管函式傳送字串給非託管函式 分三步走 a.先呼叫stringtohglobalansi將string轉換成intptr型別變...

託管和非託管

託管和非託管是修飾記憶體的。託管的意思,你不用直接操作記憶體,你需要的時候跟我說。我替你申請,然後給你用,你用完可以告訴我,我幫你釋放,如果你忙,忘記告訴我了,我也會在定期去幫你釋放的。這就是託管,你打交道的不是直接的記憶體,而是.net clr。非託管的意思就是你要自己負責管理記憶體,這裡所說的記...

託管和非託管

託管和非託管是修飾記憶體的。託管的意思,你不用直接操作記憶體,你需要的時候跟我說。我替你申請,然後給你用,你用完可以告訴我,我幫你釋放,如果你忙,忘記告訴我了,我也會在定期去幫你釋放的。這就是託管,你打交道的不是直接的記憶體,而是.net clr。非託管的意思就是你要自己負責管理記憶體,這裡所說的記...