C 和C 的資料封裝

2021-08-22 07:29:22 字數 3237 閱讀 6358

在託管**中對非託管函式進行互操作,需要對引數和返回值進行資料傳遞的過程,此過程有clr

的封送處理服務(封送拆送器)完成。 其工作內容如下:

1. 將資料從託管型別轉換為非託管型別,或從非託管型別轉換為託管型別;

2. 將經過型別轉換的資料從託管**記憶體複製到非託管記憶體,或從非託管記憶體複製到託管記憶體;

3. 呼叫完成後,釋放封送處理過程中分配的記憶體。

資料封送處理的目的:保證託管**和非託管**中定義的資料在記憶體中布局相同,從而資料正確傳送。

封送資料型別包含:可直接複製到本機結構中的型別和非直接複製到本機結構中的型別。

即在託管和非託管中,資料型別在記憶體表現形式一樣的。這些資料不需要封送拆分器處理。

windows 資料型別

非託管資料型別

託管資料型別

託管資料型別解釋

byte/uchar/uint8

unsigned char

system.byte

無符號8

位整型sbyte/char/int8

char

system.sbyte

有符號8

位整型short/int16

short

system.int16

有符號16

位整型ushort/word/uint16/wchar

unsigned short

system.uint16

無符號16

位整型bool/hresult/int/long

long/int

system.int32

有符號32

位整型dword/ulong/uint

unsigned long/unsigned int

system.uint32

無符號32

位整型int64/longlong

_int64

system.int64

有符號64

位整型uint64/dwordlong/ulonglong

_uint64

system.uint64

無符號64

位整型int_ptr/handle/wparam

void*/int或

_int64

system.intptr

有符號指標型別

handle

void*

system.uintptr

無符號指標型別

float

float

system.single

單精度浮點數

double

double

system.double

雙精度浮點數

需要封送處理。

windows 資料型別

非託管資料型別

託管資料型別

託管資料型別解釋

bool

bool

system.boolean

布林型別

wchar/tchar

char/ wchar_t

system.char

ansi字元

/unicode

字元lpcstr/lpcwstr/lpctstr/lpstr/lpwstr/lptstr

const char*/const wchar_t*/char*/wchar_t*

system.string

ansi字串

/unicode

字串,如果非託管**不需要更新此字串時,此時用

string

型別在託管**中宣告字串型別

lpstr/lpwstr/lptstr

char*/wchar_t*

system.stringbuilder

ansi字串

/unicode

字串,如果非託管**需要更新此字串,然後把更新的字串傳回託管**中,此時用

stringbuilder

型別在託管**中宣告字串

以struct

為例,對其包含

string

物件的,需要保證託管和非託管的記憶體形式一樣,其大小需一致。

typedef

struct

patimage ;

__declspec

(dllexport

)int

__stdcall

readpatimage(

char

* filename, ushort* bufdata, 

patimage& patimage);

[structlayout

(layoutkind

.sequential)]

public

struct

patimage

[dllimport

("dcmdatawin32.dll"

, entrypoint = 

"readpatimage"

)] 

public

static

extern

intreadpatimage(

string

filename,  [

marshalas

(unmanagedtype

.lparray, sizeparamindex = 1)] 

ushort

bufdata, 

refpatimage

patimage);

另外,針對string

,託管**中可使用

stringbulider

先宣告大小,然後作為引數,可返回值,但

stringbulider

不可定義

struct

中的變數,否則執行時候會提示錯誤,並提示說使用

string

及初始化的方法取代。

__declspec

(dllexport

)int

__stdcall

fndcmdatawin32(

char

* value);

[dllimport

("dcmdatawin32.dll")]

public

static

extern

intfndcmdatawin32(

stringbuilder

value);

參考:

C 資料封裝

所有的 c 程式都有以下兩個基本要素 封裝是物件導向程式設計中的把資料和運算元據的函式繫結在一起的乙個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。資料封裝引申出了另乙個重要的 oop 概念,即資料隱藏。資料封裝是一種把資料和運算元據的函式 在一起的機制,資料抽象是一種僅向使用者暴露介面而把...

C 資料封裝

一 c 資料封裝 所有的 c 程式都有以下兩個基本要素 封裝是物件導向程式設計中的把資料和運算元據的函式繫結在一起的乙個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。資料封裝引申出了另乙個重要的 oop 概念,即資料隱藏。資料封裝是一種把資料和運算元據的函式 在一起的機制,資料抽象是一種僅向...

C 資料封裝

所有的 c 程式都有以下兩個基本要素 封裝是物件導向程式設計中的把資料和運算元據的函式繫結在一起的乙個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。資料封裝引申出了另乙個重要的 oop 概念,即資料隱藏。資料封裝是一種把資料和運算元據的函式 在一起的機制,資料抽象是一種僅向使用者暴露介面而把...