先來介紹兩個預處理指令:
#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。非託管的意思就是你要自己負責管理記憶體,這裡所說的記...