锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍑哄錛歅Conline
1. struct鐨勫法澶т綔鐢?br />銆銆闈㈠涓涓漢鐨勫ぇ鍨婥/C++紼嬪簭鏃訛紝鍙湅鍏跺struct鐨勪嬌鐢ㄦ儏鍐墊垜浠氨鍙互瀵瑰叾緙栧啓鑰呯殑緙栫▼緇忛獙榪涜璇勪及銆傚洜涓轟竴涓ぇ鍨嬬殑C/C++紼嬪簭錛屽娍蹇呰娑夊強涓浜?鐢氳嚦澶ч噺)榪涜鏁版嵁緇勫悎鐨勭粨鏋勪綋錛岃繖浜涚粨鏋勪綋鍙互灝嗗師鏈剰涔夊睘浜庝竴涓暣浣撶殑鏁版嵁緇勫悎鍦ㄤ竴璧楓備粠鏌愮紼嬪害涓婃潵璇達紝浼氫笉浼氱敤struct錛屾庢牱鐢╯truct鏄尯鍒竴涓紑鍙戜漢鍛樻槸鍚﹀叿澶囦赴瀵屽紑鍙戠粡鍘嗙殑鏍囧織銆?/font>
銆銆鍦ㄧ綉緇滃崗璁侀氫俊鎺у埗銆佸祵鍏ュ紡緋葷粺鐨凜/C++緙栫▼涓紝鎴戜滑緇忓父瑕佷紶閫佺殑涓嶆槸綆鍗曠殑瀛楄妭嫻侊紙char鍨嬫暟緇勶級錛岃屾槸澶氱鏁版嵁緇勫悎璧鋒潵鐨勪竴涓暣浣擄紝鍏惰〃鐜板艦寮忔槸涓涓粨鏋勪綋銆?/font>
銆銆緇忛獙涓嶈凍鐨勫紑鍙戜漢鍛樺線寰灝嗘墍鏈夐渶瑕佷紶閫佺殑鍐呭渚濋『搴忎繚瀛樺湪char鍨嬫暟緇勪腑錛岄氳繃鎸囬拡鍋忕Щ鐨勬柟娉曚紶閫佺綉緇滄姤鏂囩瓑淇℃伅銆傝繖鏍峰仛緙栫▼澶嶆潅錛屾槗鍑洪敊錛岃屼笖涓鏃︽帶鍒舵柟寮忓強閫氫俊鍗忚鏈夋墍鍙樺寲錛岀▼搴忓氨瑕佽繘琛岄潪甯哥粏鑷寸殑淇敼銆?/font>
銆銆涓涓湁緇忛獙鐨勫紑鍙戣呭垯鐏墊椿榪愮敤緇撴瀯浣擄紝涓句竴涓緥瀛愶紝鍋囪緗戠粶鎴栨帶鍒跺崗璁腑闇瑕佷紶閫佷笁縐嶆姤鏂囷紝鍏舵牸寮忓垎鍒負packetA銆乸acketB銆乸acketC錛?/font>
struct structA
{
int a;
char b;
};
struct structB
{
char a;
short b;
};
struct structC
{
int a;
char b;
float c;
}
銆銆浼樼鐨勭▼搴忚璁¤呰繖鏍瘋璁′紶閫佺殑鎶ユ枃錛?/font>
struct CommuPacket
{
int iPacketType;銆銆//鎶ユ枃綾誨瀷鏍囧織
union銆銆銆銆銆銆//姣忔浼犻佺殑鏄笁縐嶆姤鏂囦腑鐨勪竴縐嶏紝浣跨敤union
{
聽 struct structA packetA;
聽 struct structB packetB;
聽 struct structC packetC;
}
};
銆銆鍦ㄨ繘琛屾姤鏂囦紶閫佹椂錛岀洿鎺ヤ紶閫乻truct CommuPacket涓涓暣浣撱?/font>
銆銆鍋囪鍙戦佸嚱鏁扮殑鍘熷艦濡備笅錛?/font>
// pSendData錛氬彂閫佸瓧鑺傛祦鐨勯鍦板潃錛宨Len錛氳鍙戦佺殑闀垮害
Send(char * pSendData, unsigned int聽 iLen);
鍙戦佹柟鍙互鐩存帴榪涜濡備笅璋冪敤鍙戦乻truct CommuPacket鐨勪竴涓疄渚媠endCommuPacket錛?br />Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
鍋囪鎺ユ敹鍑芥暟鐨勫師褰㈠涓嬶細
// pRecvData錛氬彂閫佸瓧鑺傛祦鐨勯鍦板潃錛宨Len錛氳鎺ユ敹鐨勯暱搴?br />//榪斿洖鍊鹼細瀹為檯鎺ユ敹鍒扮殑瀛楄妭鏁?br />unsigned int Recv(char * pRecvData, unsigned int聽 iLen)錛?br />銆銆鎺ユ敹鏂瑰彲浠ョ洿鎺ヨ繘琛屽涓嬭皟鐢ㄥ皢鎺ユ敹鍒扮殑鏁版嵁淇濆瓨鍦╯truct CommuPacket鐨勪竴涓疄渚媟ecvCommuPacket涓細
Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );
銆銆鎺ョ潃鍒ゆ柇鎶ユ枃綾誨瀷榪涜鐩稿簲澶勭悊錛?/font>
switch(recvCommuPacket. iPacketType)
{
聽聽聽 case PACKET_A:
聽聽聽 鈥β犅犅?//A綾繪姤鏂囧鐞?br />聽聽聽 break;
聽聽聽 case PACKET_B:
聽聽聽 鈥︺聽 //B綾繪姤鏂囧鐞?br />聽聽聽 break;
聽聽聽 case PACKET_C:
聽聽聽 鈥β犅?//C綾繪姤鏂囧鐞?br />聽聽聽 break;
}
銆銆浠ヤ笂紼嬪簭涓渶鍊煎緱娉ㄦ剰鐨勬槸
Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );
銆銆涓殑寮哄埗綾誨瀷杞崲錛?char *)&sendCommuPacket銆?char *)&recvCommuPacket錛屽厛鍙栧湴鍧錛屽啀杞寲涓篶har鍨嬫寚閽堬紝榪欐牱灝卞彲浠ョ洿鎺ュ埄鐢ㄥ鐞嗗瓧鑺傛祦鐨勫嚱鏁般?/font>
銆銆鍒╃敤榪欑寮哄埗綾誨瀷杞寲錛屾垜浠繕鍙互鏂逛究紼嬪簭鐨勭紪鍐欙紝渚嬪瑕佸sendCommuPacket鎵澶勫唴瀛樺垵濮嬪寲涓?錛屽彲浠ヨ繖鏍瘋皟鐢ㄦ爣鍑嗗簱鍑芥暟memset()錛?/font>
memset((char *)&sendCommuPacket,0, sizeof(CommuPacket));
2. struct鐨勬垚鍛樺榻?br />銆銆Intel銆佸井杞瓑鍏徃鏇劇粡鍑鴻繃涓閬撶被浼肩殑闈㈣瘯棰橈細
1. #include <iostream.h>
2. #pragma pack(8)
3. struct example1
4. {
5. short a;
6. long b;
7. };
8. struct example2
9. {
10. char c;
11. example1 struct1;
12. short e;聽聽聽
13. };
14. #pragma pack()
15. int main(int argc, char* argv[])
16. {
17. example2 struct2;
18. cout << sizeof(example1) << endl;
19. cout << sizeof(example2) << endl;
20. cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;
21. return 0;
22. }
銆銆闂▼搴忕殑杈撳叆緇撴灉鏄粈涔堬紵
銆銆絳旀鏄細
8
16
4
銆銆涓嶆槑鐧斤紵榪樻槸涓嶆槑鐧斤紵涓嬮潰涓涓閬撴潵錛?br />2.1 鑷劧瀵圭晫
銆銆struct鏄竴縐嶅鍚堟暟鎹被鍨嬶紝鍏舵瀯鎴愬厓绱犳棦鍙互鏄熀鏈暟鎹被鍨嬶紙濡俰nt銆乴ong銆乫loat絳夛級鐨勫彉閲忥紝涔熷彲浠ユ槸涓浜涘鍚堟暟鎹被鍨嬶紙濡俛rray銆乻truct銆乽nion絳夛級鐨勬暟鎹崟鍏冦傚浜庣粨鏋勪綋錛岀紪璇戝櫒浼氳嚜鍔ㄨ繘琛屾垚鍛樺彉閲忕殑瀵歸綈錛屼互鎻愰珮榪愮畻鏁堢巼銆傜己鐪佹儏鍐典笅錛岀紪璇戝櫒涓虹粨鏋勪綋鐨勬瘡涓垚鍛樻寜鍏惰嚜鐒跺鐣岋紙natural alignment錛夋潯浠跺垎閰嶇┖闂淬傚悇涓垚鍛樻寜鐓у畠浠澹版槑鐨勯『搴忓湪鍐呭瓨涓『搴忓瓨鍌紝絎竴涓垚鍛樼殑鍦板潃鍜屾暣涓粨鏋勭殑鍦板潃鐩稿悓銆?br />銆銆鑷劧瀵圭晫(natural alignment)鍗抽粯璁ゅ榻愭柟寮忥紝鏄寚鎸夌粨鏋勪綋鐨勬垚鍛樹腑size鏈澶х殑鎴愬憳瀵歸綈銆?br />銆銆渚嬪錛?br />struct naturalalign
{
char a;
short b;
char c;
};
銆銆鍦ㄤ笂榪扮粨鏋勪綋涓紝size鏈澶х殑鏄痵hort錛屽叾闀垮害涓?瀛楄妭錛屽洜鑰岀粨鏋勪綋涓殑char鎴愬憳a銆乧閮戒互2涓哄崟浣嶅榻愶紝sizeof(naturalalign)鐨勭粨鏋滅瓑浜?錛?br />銆銆濡傛灉鏀逛負錛?br />struct naturalalign
{
char a;
int b;
char c;
};
銆銆鍏剁粨鏋滄樉鐒朵負12銆?/font>
2.2鎸囧畾瀵圭晫
銆銆涓鑸湴錛屽彲浠ラ氳繃涓嬮潰鐨勬柟娉曟潵鏀瑰彉緙虹渷鐨勫鐣屾潯浠訛細
銆銆路 浣跨敤浼寚浠?pragma pack (n)錛岀紪璇戝櫒灝嗘寜鐓涓瓧鑺傚榻愶紱
銆銆路 浣跨敤浼寚浠?pragma pack ()錛屽彇娑堣嚜瀹氫箟瀛楄妭瀵歸綈鏂瑰紡銆?br />銆銆娉ㄦ剰錛氬鏋?pragma pack (n)涓寚瀹氱殑n澶т簬緇撴瀯浣撲腑鏈澶ф垚鍛樼殑size錛屽垯鍏朵笉璧蜂綔鐢紝緇撴瀯浣撲粛鐒舵寜鐓ize鏈澶х殑鎴愬憳榪涜瀵圭晫銆?br />銆銆渚嬪錛?br />#pragma pack (n)
struct naturalalign
{
char a;
int b;
char c;
};
#pragma pack ()
銆銆褰搉涓?銆?銆?6鏃訛紝鍏跺榻愭柟寮忓潎涓鏍鳳紝sizeof(naturalalign)鐨勭粨鏋滈兘絳変簬12銆傝屽綋n涓?鏃訛紝鍏跺彂鎸ヤ簡浣滅敤錛屼嬌寰梥izeof(naturalalign)鐨勭粨鏋滀負8銆?br />銆銆鍦╒C++ 6.0緙栬瘧鍣ㄤ腑錛屾垜浠彲浠ユ寚瀹氬叾瀵圭晫鏂瑰紡錛屽叾鎿嶄綔鏂瑰紡涓轟緷嬈¢夋嫨projetct > setting > C/C++鑿滃崟錛屽湪struct member alignment涓寚瀹氫綘瑕佺殑瀵圭晫鏂瑰紡銆?br />銆銆鍙﹀錛岄氳繃__attribute((aligned (n)))涔熷彲浠ヨ鎵浣滅敤鐨勭粨鏋勪綋鎴愬憳瀵歸綈鍦╪瀛楄妭杈圭晫涓婏紝浣嗘槸瀹冭緝灝戣浣跨敤錛屽洜鑰屼笉浣滆緇嗚瑙c?/font>
2.3 闈㈣瘯棰樼殑瑙g瓟
銆銆鑷蟲錛屾垜浠彲浠ュIntel銆佸井杞殑闈㈣瘯棰樿繘琛屽叏闈㈢殑瑙g瓟銆?br />銆銆紼嬪簭涓2琛?pragma pack (8)铏界劧鎸囧畾浜嗗鐣屼負8錛屼絾鏄敱浜巗truct example1涓殑鎴愬憳鏈澶ize涓?錛坙ong鍙橀噺size涓?錛夛紝鏁卻truct example1浠嶇劧鎸?瀛楄妭瀵圭晫錛宻truct example1鐨剆ize涓?錛屽嵆絎?8琛岀殑杈撳嚭緇撴灉錛?br />銆銆struct example2涓寘鍚簡struct example1錛屽叾鏈韓鍖呭惈鐨勭畝鍗曟暟鎹垚鍛樼殑鏈澶ize涓?錛坰hort鍙橀噺e錛夛紝浣嗘槸鍥犱負鍏跺寘鍚簡struct example1錛岃宻truct example1涓殑鏈澶ф垚鍛榮ize涓?錛宻truct example2涔熷簲浠?瀵圭晫錛?pragma pack (8)涓寚瀹氱殑瀵圭晫瀵箂truct example2涔熶笉璧蜂綔鐢紝鏁?9琛岀殑杈撳嚭緇撴灉涓?6錛?br />銆銆鐢變簬struct example2涓殑鎴愬憳浠?涓哄崟浣嶅鐣岋紝鏁呭叾char鍙橀噺c鍚庡簲琛ュ厖3涓┖錛屽叾鍚庢墠鏄垚鍛榮truct1鐨勫唴瀛樼┖闂達紝20琛岀殑杈撳嚭緇撴灉涓?銆?br />
浜屻佸墠鏈熷噯澶?
棣栧厛鎴戜滑寤虹珛涓寮犲悕涓簎serinfo鐨勮〃錛屽寘鍚笁涓瓧孌?id,username,old,photo,鍏朵腑photo鏄竴涓彲浠ュ瓨鍌ㄤ簩榪涘埗鏁版嵁鐨勫瓧孌點?
2.1 鍦⊿QL SERVER涓垜浠彲浠ュ湪Query Analyzer涓洿鎺ヨ緭鍏ュ涓嬭鍙ュ垱寤猴細
CREATE TABLE [dbo].[userphoto] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[username] [varchar] (50) NULL ,
[old] [int] NULL ,
[photo] [image] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
鍏朵腑photo鎴戜滑瀹氫箟涓篿mage綾誨瀷鐨勫瓧孌點?
2.2 鍦ˋCCESS涓垱寤虹殑鏂規硶濡備笅錛?
寤虹珛涓寮犳柊琛ㄥ寘鎷琲d,username,old,photo鍥涗釜瀛楁錛岀劧鍚庢墦寮琛紝閫夎鍥捐彍鍗曚腑璁捐瑙嗗浘錛屽皢id璁劇疆涓鴻嚜鍔ㄧ紪鍙風殑閫掑闀挎暣鍨嬶紝username涓烘枃鏈紝old涓烘暟瀛楋紝photo涓篛LE瀵硅薄銆?
鍦ㄦ垜浠殑紺轟緥宸ョ▼涓凡緇忓寘鍚簡涓涓緩绔嬪ソ鐨凙CCESS2000鐨勫簱錛屼綘鍙互鐩存帴鎷挎潵浣跨敤銆?
涓夈佸叿浣撴楠?
3.1 BLOB鏁版嵁鐨勪繚瀛?
BLOB綾誨瀷鐨勬暟鎹棤娉曠敤鏅氱殑鏂瑰紡榪涜瀛樺偍錛屾垜浠渶瑕佷嬌鐢ˋppendChunk鍑芥暟錛孉ppendChunk鍖呭惈鍦‵ield瀵硅薄涓紝鍘熷瀷濡備笅錛?
HRESULT AppendChunk (const _variant_t & Data );
浠庡嚱鏁板師鍨嬩腑鍙互鐪嬪埌鍏抽敭鐨勯棶棰樻槸鎴戜滑闇鎶婁簩榪涘埗鏁版嵁璧嬪肩粰VARIANT綾誨瀷鐨勫彉閲忥紝涓嬮潰鎴戜滑緇欏嚭鍏蜂綋鐨勪唬鐮佸茍浣滅畝鍗曠殑鍒嗘瀽:
///鍋囪m_pBMPBuffer鎸囬拡鎸囧悜涓鍧楅暱搴︿負m_nFileLen鐨勪簩榪涘埗鏁版嵁,騫朵笖宸茬粡鎴愬姛鎵撳紑浜嗚褰曢泦瀵硅薄m_pRecordset///
char *pBuf = m_pBMPBuffer ;
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
m_pRecordset->AddNew(); ///娣誨姞鏂拌褰?
m_pRecordset->PutCollect("username",_variant_t("灝忔潕")); ///涓烘柊璁板綍濉厖username瀛楁
m_pRecordset->PutCollect("old",_variant_t((long)28); ///濉厖old瀛楁
if(pBuf){
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_nFileLen;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///鍒涘緩SAFEARRAY瀵硅薄
for (long i = 0; i < (long)m_nFileLen; i++)
SafeArrayPutElement (psa, &i, pBuf++); ///灝唒Buf鎸囧悜鐨勪簩榪涘埗鏁版嵁淇濆瓨鍒癝AFEARRAY瀵硅薄psa涓?
varBLOB.vt = VT_ARRAY | VT_UI1;///灝唙arBLOB鐨勭被鍨嬭緗負BYTE綾誨瀷鐨勬暟緇?
varBLOB.parray = psa; ///涓簐arBLOB鍙橀噺璧嬪?
m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varBLOB); ///鍔犲叆BLOB綾誨瀷鐨勬暟鎹?
}
m_pRecordset->Update(); ///淇濆瓨鎴戜滑鐨勬暟鎹埌搴撲腑
鑷蟲鎴戜滑鐨勬暟鎹凡緇忔垚鍔熷湴淇濆瓨鍒頒簡鏁版嵁搴撲腑,鎺ヤ笅鏉ユ垜浠墍瑕佸仛鐨勫伐浣滀究鏄皢璇ユ暟鎹彁鍙栧嚭鏉?璁╂垜浠戶緇惂!
3.2 BLOB鏁版嵁鐨勮鍙?
瀵瑰簲浜庝繚瀛樻暟鎹椂鎴戜滑鎵浣跨敤鐨凙ppendChunk鍑芥暟錛岃鍙栨暟鎹簲璇ヤ嬌鐢℅etChunk鍑芥暟,GetChunk鐨勫師鍨嬪涓?
_variant_t GetChunk (long Length );
緇欏嚭鏁版嵁鐨勯暱搴﹀悗GetChunk灝嗚繑鍥炲寘鍚暟鎹殑VARIANT綾誨瀷鍙橀噺,鐒跺悗鎴戜滑鍙互鍒╃敤SafeArrayAccessData鍑芥暟寰楀埌VARIANT鍙橀噺涓寚鍚戞暟鎹殑char *綾誨瀷鐨勬寚閽?浠ユ柟渚挎垜浠殑澶勭悊錛屽叿浣撲唬鐮佸涓嬶細
long lDataSize = m_pRecordset->GetFields()->GetItem("photo")->ActualSize;
///寰楀埌鏁版嵁鐨勯暱搴?
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("photo")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///鍒ゆ柇鏁版嵁綾誨瀷鏄惁姝g‘
{
銆銆 char *pBuf = NULL;
銆銆 SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
銆銆 ///寰楀埌鎸囧悜鏁版嵁鐨勬寚閽?/*****鍦ㄨ繖閲屾垜浠彲浠ュpBuf涓殑鏁版嵁榪涜澶勭悊*****/
銆銆 SafeArrayUnaccessData (varBLOB.parray);
銆銆 }
}
浠ヤ笂鎴戜滑鎴愬姛瀹炵幇浜咮LOB鏁版嵁鍦ㄦ暟鎹簱涓殑瀛樺彇錛屼負浜嗚澶у鏈夌幇鎴愮殑渚嬪瓙鍙互鍙傝冿紝鏈枃鎻愪緵浜嗙ず渚嬪伐紼嬶紝鍦ㄧず渚嬪伐紼嬩腑鎴戜滑鍦ㄦ暟鎹簱涓繚瀛樺浘鍍忔暟鎹紝騫跺彲浠ュ榪欎簺鍥懼儚榪涜嫻忚銆佷慨鏀癸紝璇ヤ緥瀛愯繕娑夊強鍒板浣曠敤char *鎸囧悜鐨凚MP鏂囦歡鏁版嵁鍒涘緩BITMAP瀵硅薄鐒跺悗鏄劇ず鍑烘潵銆?br />
|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
long
i
= 0;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
VARIANT
va
= {0};
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
va
.
vt
=
VT_BSTR
;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
SAFEARRAYBOUND
bounds
[1] = {0};
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
bounds
[0].
cElements
= 5;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
SAFEARRAY
*
psa
=
SafeArrayCreate
(
VT_VARIANT
, 1,
bounds
);
|
聽
l聽聽聽聽聽聽聽聽
瀛樺叆鍏冪礌
|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
for
(
i
= 0;
i
< 5;
i
++)
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
va
.
bstrVal
=
SysAllocString
(L
"test"
);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
SafeArrayPutElement
(
psa
, &
i
, &
va
);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
|
聽
l聽聽聽聽聽聽聽聽
鑾峰彇鍏冪礌
|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
for
(
i
= 0;
i
< 5;
i
++)
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
va
.
bstrVal
=
SysAllocString
(L
"test"
);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
SafeArrayGetElement
(
psa
, &
i
, &
va
);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
SysFreeString
(
va
.
bstrVal
);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 }
|
聽
l聽聽聽聽聽聽聽聽
閿姣?/span>
|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
SafeArrayDestroy
(
psa
);
|
聽
l聽聽聽聽聽聽聽聽
鐢熸垚
VARIANT
鍙橀噺
|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
VARIANT
vsa
= {0};
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
vsa
.
vt
=
VT_ARRAY
|
VT_BSTR
; 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 vsa . parray = psa ; |
棣栧厛璇瘋浣嶇湅浠ヤ笅涓孌碘滃嵄闄┾濈殑C++浠g爜錛?/p>
void聽function(聽void聽) |
涔嬫墍浠ヨ鍏跺嵄闄╋紝鏄洜涓鴻繖鏄竴孌靛畬鍏ㄥ悎涔庤娉曠殑浠g爜錛岀紪璇戠殑鏃跺欏畬緹庡緱涓鐐歸敊璇篃涓嶄細鏈夛紝鐒惰屽綋榪愯鍒皊trcpy涓鍙ョ殑鏃跺欙紝闂灝變細鍑虹幇錛屽洜涓哄湪榪欎箣鍓嶏紝str鐨勭┖闂村凡緇忚delete鎺変簡錛屾墍浠trcpy褰撶劧涓嶄細鎴愬姛銆傚浜庤繖縐嶇被浼肩殑鎯呭喌錛屽湪鏋楅攼鍗氬+鐨勪功涓湁榪囦粙緇嶏紝縐板叾涓衡滈噹鎸囬拡鈥濄?/p>
閭d箞錛岃浣嶆湁娌℃湁瑙佽繃瀹夊叏鐨勨滈噹鎸囬拡鈥濆憿錛熶笅闈㈣鐪嬫垜鐨勪竴孌礐++紼嬪簭錛岀伒鎰熸潵鑷狢SDN涓婄殑涓嬈¤璁恒傚湪姝わ紝鎴戝彧闇瑕丆++鐨勨滅被鈥濓紝C++鐨勫叾浣欎竴姒備笉闇瑕侊紝鍥犳鎴戞病鏈変嬌鐢ㄤ換浣曠殑C++鏍囧噯搴擄紝榪炶緭鍑洪兘鏄敤printf瀹屾垚鐨勩?/p>
#include聽<stdio.h> |
OK錛岀▼搴忓埌姝や負姝紝璇鎬綅鍙互緙栬瘧榪愯涓涓嬬湅鐪嬬粨鏋滃浣曘備綘涔熻浼氭儕寮傚湴鍙戠幇錛氭病鏈変換浣曠殑鍑洪敊淇℃伅錛屽睆騫曚笂绔熺劧涔栦箹鍦板嚭鐜頒簡榪欎箞涓琛屽瓧絎︿覆錛?/p>
This is a test function.
濂囨悧錛熶笉瑕佹ワ紝榪樻湁鏇村鎬殑鍛紝浣犲彲浠ユ妸涓誨嚱鏁頒腑鍔犱笂涓鍙ユ洿涓嶅彲鐞嗗柣鐨勶細
((CTestClass*)NULL)->Function(); |
榪欎粛鐒舵病鏈夐棶棰橈紒錛?/p>
鎴戣繖榪樻湁鍛紝鍝堝搱銆傜幇鍦ㄤ綘鍦ㄤ富鍑芥暟涓繖涔堝啓錛屽樿涓婁竴鍙ヤ笉鍙悊鍠伙紝閭d箞浠ヤ笅鍙互鍙仛鏃犳硶鏃犲ぉ浜嗭細
int聽i聽=聽888; |
浣犵湅鍒頒簡浠涔堬紵鏄殑錛屸淭his is a test function.鈥濆綰﹁岃嚦錛屾病鏈変換浣曠殑閿欒銆?/p>
浣犱篃璁歌闂負浠涔堬紝浣嗘槸鍦ㄦ垜瑙g瓟浣犱箣鍓嶏紝璇蜂綘鍦ㄤ富鍑芥暟涓姞鍏ュ涓嬩唬鐮侊細
printf(聽"%d,聽%d",聽sizeof(聽CTestClass聽),聽sizeof(聽int聽)聽); |
榪欐椂浣犲氨浼氱湅鍒扮湡鐩鎬簡錛氳緭鍑虹粨鏋滄槸鈥斺斿緱鍒扮殑涓や釜鍗佽繘鍒舵暟鐩哥瓑銆傚錛岀敱sizeof寰楀埌鐨凜TestClass鐨勫ぇ灝忓叾瀹炲氨鏄畠鐨勬垚鍛榤_nInteger鐨勫ぇ灝忋備害鍗蟲槸璇達紝瀵逛簬CTestClass鐨勪竴涓疄渚嬪寲鐨勫璞★紙璁句負a錛夎岃█錛屽彧鏈塧.m_nInteger鏄睘浜巃榪欎釜瀵硅薄鐨勶紝鑰宎.Function()鍗存槸灞炰簬CTestClass榪欎釜綾葷殑銆傛墍浠ヤ互涓婄湅浼煎嵄闄╃殑鎿嶄綔鍏跺疄閮芥槸鍙涓旀棤璇殑銆?/p>
鐜板湪浣犳槑鐧戒負浠涔堟垜鐨勨滈噹鎸囬拡鈥濇槸瀹夊叏鐨勪簡錛岄偅涔堜互涓嬫垜鎵鍒楀嚭鐨勶紝灝辨槸鍦ㄤ粈涔堟儏鍐典笅錛屾垜鐨勨滈噹鎸囬拡鈥濅笉瀹夊叏錛?/p>
浠ヤ笂鐨勪袱縐嶆儏鍐碉紝鐩殑灝辨槸寮鴻揩閲庢寚閽堜嬌鐢ㄥ睘浜庤嚜宸辯殑涓滆タ瀵艱嚧涓嶅畨鍏紝姣斿絎竴縐嶆儏鍐典腑鎿嶄綔鏈韓鐨刴_nInteger錛岀浜岀鎯呭喌涓彉涓鴻櫄鍑芥暟鐨凢unction鎴愪負浜嗗睘浜庡璞$殑鍑芥暟錛堣繖涓鐐瑰彲浠ヤ粠sizeof鐪嬪嚭鏉ワ級銆?/p>
鍏跺疄錛屽畨鍏ㄧ殑閲庢寚閽堝湪瀹為檯鐨勭▼搴忚璁′腑鏄嚑涔庢鏃犵敤澶勭殑銆傛垜鍐欒繖涓綃囨枃绔狅紝鎰忓浘騫朵笉鏄儚瀛斾箼宸變竴鏍峰幓鐞㈢(鍥炲瓧鏈夊嚑縐嶅啓娉曪紝鑰屾槸鎯抽氳繃榪欎釜灝忎緥瀛愬悜璇鎬綅鍐欐槑鐧紺++鐨勫璞″疄渚嬪寲鏈川錛屽笇鏈涘ぇ瀹朵笉浣嗚鏄庣櫧what鍜宧ow錛屾洿瑕佹槑鐧絯hy銆傛潕椹簩闆墮浂涓夊勾浜屾湀浜屽崄鏃ヤ綔浜庤嚜瀹呫?/p>
鍏充簬鎴愬憳鍑芥暟CTestClass::Function鐨勮ˉ鍏呰鏄?/b>
榪欎釜鍑芥暟鏄竴涓櫘閫氱殑鎴愬憳鍑芥暟錛屽畠鍦ㄧ紪璇戝櫒鐨勫鐞嗕笅錛屼細鎴愪負綾諱技濡備笅鐨勪唬鐮侊細
void聽Function(聽const聽CTestClass聽*聽this聽)聽//聽鈶?/font> |
閭d箞p->Function();涓鍙ュ皢琚紪璇戝櫒瑙i噴涓猴細
Function( p ); |
榪欏氨鏄錛屾櫘閫氱殑鎴愬憳鍑芥暟蹇呴』緇忕敱涓涓璞℃潵璋冪敤錛堢粡鐢眛his鎸囬拡嬋媧燴憽錛夈傞偅涔堢敱涓婁緥鐨刣elete涔嬪悗錛宲鎸囬拡灝嗕細鎸囧悜涓涓棤鏁堢殑鍦板潃錛岀劧鑰宲鏈韓鏄竴涓湁鏁堢殑鍙橀噺錛屽洜姝ょ紪璇戣兘澶熼氳繃銆傚茍涓斿湪緙栬瘧閫氳繃涔嬪悗錛岀敱浜嶤TestClass::Function鐨勫嚱鏁頒綋鍐呭茍鏈榪欎釜浼犲叆鐨則his鎸囬拡榪涜浠諱綍鐨勬搷浣滐紝鎵浠ュ湪榪欓噷錛屸滈噹鎸囬拡鈥濅究鎴愪簡涓涓湅浼煎畨鍏ㄧ殑涓滆タ銆?/p>
鐒惰岃嫢榪欐牱鏀瑰啓CTestClass::Function錛?/p>
void聽CTestClass::Function(聽void聽) |
閭d箞瀹冨皢浼氳緙栬瘧鍣ㄨВ閲婁負錛?/p>
void聽Function(聽const聽CTestClass聽*聽this聽) |
浣犵湅鍒頒簡錛屽湪p->Function();鐨勬椂鍊欙紝緋葷粺灝嗕細灝濊瘯鍦ㄤ紶鍏ョ殑榪欎釜鏃犳晥鍦板潃涓鎵緈_nInteger鎴愬憳騫跺皢鍏惰祴鍊間負0錛屽墿涓嬬殑鎴戜笉鐢ㄨ浜嗏斺旈潪娉曟搷浣滃嚭鐜頒簡銆?/p>
鑷充簬virtual铏氬嚱鏁幫紝濡傛灉鍦ㄧ被瀹氫箟涔嬩腑灝咰TestClass澹版槑涓鴻櫄鍑芥暟錛?/p>
class聽CTestClass |
閭d箞C++鍦ㄦ瀯寤篊TestClass綾葷殑瀵硅薄妯″瀷鏃訛紝灝嗕細涓轟箣鍒嗛厤涓涓櫄鍑芥暟琛╲ptr錛堝彲浠ヤ粠sizeof鐪嬪嚭鏉ワ級銆倂ptr鏄竴涓寚閽堬紝瀹冩寚鍚戜竴涓嚱鏁版寚閽堢殑鏁扮粍錛屾暟緇勪腑鐨勬垚鍛樺嵆鏄湪CTestClass涓0鏄庣殑鎵鏈夎櫄鍑芥暟銆傚湪璋冪敤铏氬嚱鏁扮殑鏃跺欙紝蹇呴』緇忕敱榪欎釜vptr錛岃繖涔熷氨鏄負浠涔堣櫄鍑芥暟杈冧箣鏅氭垚鍛樺嚱鏁拌娑堣椾竴浜涙垚鏈殑緙樻晠銆備互鏈緥鑰岃█錛宲->Function();涓鍙ュ皢琚紪璇戝櫒瑙i噴涓猴細
(*p->vptr[1])(聽p聽);聽//聽璋冪敤vptr琛ㄤ腑绱㈠紩鍙蜂負1鐨勫嚱鏁幫紙鍗矲unction錛夆憿 |
涓婇潰鐨勪唬鐮佸凡緇忚鏄庝簡錛屽鏋減鎸囧悜涓涓棤鏁堢殑鍦板潃錛岄偅涔堝繀鐒朵細鏈夐潪娉曟搷浣溿?/p>
澶囨敞錛?/p>
鈶犲叧浜庡嚱鏁扮殑鍛藉悕錛屾垜閲囩敤浜嗗師鍚嶈屾病鏈夊彉鍖栥備簨瀹炰笂緙栬瘧鍣ㄤ負浜嗛伩鍏嶅嚱鏁伴噸杞介犳垚鐨勯噸鍚嶆儏鍐碉紝浼氬鍑芥暟鐨勫悕瀛楄繘琛屽鐞嗭紝浣夸箣鎴愪負鐙竴鏃犱簩鐨勫悕縐般?br />鈶″皢鎴愬憳鍑芥暟澹版槑涓簊tatic錛屽彲浠ヤ嬌鎴愬憳鍑芥暟涓嶇粡鐢眛his鎸囬拡渚垮彲璋冪敤銆?br />鈶ptr琛ㄤ腑錛岀儲寮曞彿0涓虹被鐨則ype_info銆?/p>
浜屻佽嚜鍔ㄩ厤緗暟鎹簮聽
聽聽聽 寰堝鐨勭▼搴忛兘瑕佺敤鍒版暟鎹簱緇撳悎鐨勬搷浣滐紝榪欓噷涓句緥ACCESS錛屽洜涓篈CCESS鍦ㄤ腑灝忓瀷VC緋葷粺寮鍙戜腑鏄渶甯哥敤鍒扮殑錛屽鏋滅▼搴忕殑縐繪錛屽鏋滃浜庡緢鍒濈駭鐨勭敤鎴鋒潵璇達紝浣犺繕闇瑕佷粬鍒伴厤緗潰鏉夸腑榪涜鏁版嵁婧愰厤緗殑璇濓紝閭e氨鏈夌偣璇翠笉榪囧幓浜嗐偮?
聽聽聽聽聽聽聽聽 #include <odbcinst.h>聽
聽聽聽聽聽聽聽聽 //閰嶇疆鏁版嵁婧愶紝鏁版嵁搴撳湪搴旂敤紼嬪簭鐩綍涓?榪欓噷姣斿鏁版嵁搴撴枃浠跺悕涓?**.mdb錛岀▼搴忚繍琛屾椂鍊欏彲浠ュ皢鏁版嵁搴撴枃浠舵嫹璐濆埌紼嬪簭鐩綍涓嬮潰銆偮?
聽聽聽 CString sPath;聽
聽聽聽 GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);聽
聽聽聽 sPath.ReleaseBuffer();聽
聽聽聽 int nPos;聽
聽聽聽 nPos=sPath.ReverseFind(鈥橽\鈥?;聽
聽聽聽 sPath=sPath.Left(nPos);聽
聽聽聽 CString lpszFileName = sPath + "\\***.mdb";//榪欓噷淇敼鎴愪綘鐨勬暟鎹簱鏂囦歡鍚嶇О聽
聽聽聽 CFileFind聽 fFind;聽
聽聽聽 if(!fFind.FindFile(lpszFileName))聽
聽聽聽 {聽
聽聽聽聽聽聽聽 ::AfxMessageBox("娌℃湁鎵懼埌鏁版嵁搴?);聽
聽聽聽聽聽聽聽 exit(0);聽
聽聽聽 }聽聽
聽聽聽 CString szDesc;聽
聽聽聽 szDesc.Format( "DSN=****;Description=****;DESCRIPTION=The DataBase For ***;FIL=MicrosoftAccess;DEFAULTDIR=%s;DBQ=%s;" ,sPath,lpszFileName);//榪欓噷***鍙峰彲浠ユ坊鍔犳垚浣犵殑鎻忚堪聽
聽聽聽 //娣誨姞鏁版嵁婧惵?
聽聽聽 if(!::SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",(LPCSTR)szDesc))聽
聽聽聽 {聽
聽聽聽聽聽聽聽 ::AfxMessageBox("32浣峅DBC鏁版嵁婧愰厤緗敊璇?");聽
聽聽聽聽聽聽聽 exit(0);聽
聽聽聽 }聽
涓夈佽緗樉紺烘ā寮忥細聽
聽聽聽 寰堝鐨勭▼搴忕殑縐繪鐨勮繍琛岀幆澧冩槸鏀瑰彉鐨勩傛湁鍙兘浣犵殑鍘熸潵寮鍙戠幆澧冩槸1024X768錛屼絾鏄埌浜嗛偅浜涙樉紺哄櫒澶т簬17鐨勬椂鍊欙紙鍒嗚鯨鐜囪秴榪囦綘鐨勫紑鍙戞椂鐨勫垎杈ㄧ巼鏃訛級錛岀▼搴忕殑鏄劇ず鍙兘灝變笉濂界湅浜嗐偮?
聽聽聽聽聽聽聽聽 DEVMODE lpDevMode;聽
聽聽聽 lpDevMode.dmPelsHeight=768;//Y鏂瑰悜璞$礌鐐孤?
聽聽聽 lpDevMode.dmPelsWidth=1024;//X鏂瑰悜璞$礌鐐孤?
聽聽聽 lpDevMode.dmDisplayFrequency=85;//灞忓箷鍒鋒柊鐜嚶?
聽聽聽 lpDevMode.dmFields=DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;聽
聽聽聽 ChangeDisplaySettings(&lpDevMode,0);聽
鍥涖佸湪浣犵殑紼嬪簭涓棿鍔犺澆鍏朵粬搴旂敤紼嬪簭錛毬?
聽聽聽 浣犵殑紼嬪簭闄や簡璋冪敤鍒板悇涓ā鍧楄繘琛屽崗鍚屽伐浣滃錛圖LL錛夛紝榪樻湁鍙兘璋冪敤涓嶆槸鍚屼竴涓紑鍙戠幆澧冧笅鐨勫簲鐢ㄧ▼搴忥紝姣斿VC鐜涓嬭皟鐢―ELPHI錛孷B寮鍙戠殑鎵ц紼嬪簭錛屼綘灝卞彲浠ョ敤鍒頒笅闈㈢殑鏂規硶錛堝皢璋冪敤鐨勫簲鐢ㄧ▼搴忔嫹璐濈▼搴忕洰褰曚腑錛夛細聽
聽聽聽聽聽聽聽聽 CString sPath;聽
聽聽聽 GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);聽
聽聽聽 sPath.ReleaseBuffer();聽
聽聽聽 int nPos;聽
聽聽聽 nPos=sPath.ReverseFind(鈥橽\鈥?;聽
聽聽聽 sPath=sPath.Left(nPos);聽
聽聽聽 CString lpszFileName = sPath + "\\***.exe";//榪欓噷淇敼鎴愪綘鐨勮皟鐢ㄥ簲鐢ㄧ▼搴忕殑鏂囦歡鍚嶇О聽
聽聽聽 CFileFind聽 fFind;聽
聽聽聽 if(!fFind.FindFile(lpszFileName))聽
聽聽聽 {聽
聽聽聽聽聽聽聽 ::AfxMessageBox("娌℃湁鎵懼埌璋冪敤鐨勫簲鐢ㄧ▼搴忥紒");聽聽
聽聽聽聽聽聽聽 return FALSE;聽
聽聽聽 }聽
聽聽聽 else聽
聽聽聽聽聽聽聽 ShellExecute(NULL,NULL,_T("***.exe"),NULL,sPath,NULL);聽聽
浜斻佺粨鏉熻繘紼嬶細聽
聽聽聽 鍦ㄤ綘鐨勭▼搴忎腑緇撴潫鍒殑紼嬪簭榪涚▼錛岄噰鐢ㄧ殑鏂規硶鏄繘琛岃繘紼嬪垪涓撅紝鐒跺悗閲囩敤鏌ユ壘鐨勬柟娉曡繘琛岋細聽
聽聽聽聽聽聽聽聽 #include "TLHELP32.H"聽
聽聽聽聽聽聽聽聽 DWORD ProcessID[50];聽
聽聽聽 CString kkk[50];聽
聽聽聽 HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);聽聽
聽聽聽 PROCESSENTRY32* info=new PROCESSENTRY32;聽
聽聽聽 PROCESSENTRY32 ProcessInfo;//澹版槑榪涚▼淇℃伅鍙橀噺聽
聽聽聽 ProcessInfo.dwSize=sizeof(ProcessInfo);//璁劇疆ProcessInfo鐨勫ぇ灝徛?
聽聽聽 //榪斿洖緋葷粺涓涓涓繘紼嬬殑淇℃伅聽
聽聽聽 BOOL Status=Process32First(SnapShot,&ProcessInfo);聽
聽聽聽 int m_nProcess=0;聽聽
聽聽聽 while(Status)聽
聽聽聽 {聽
聽聽聽聽聽聽聽 CString s,str1,str2;聽
聽聽聽聽聽聽聽 s.Format("%d",ProcessInfo.cntThreads);聽
聽聽聽聽聽聽聽 str1.Format("%s",ProcessInfo.szExeFile);聽
聽聽聽聽聽聽聽 str1=ProcessInfo.szExeFile;聽
聽聽聽聽聽聽聽 kkk[m_nProcess]=ProcessInfo.szExeFile;聽聽
聽聽聽聽聽聽聽 ProcessID[m_nProcess]=ProcessInfo.th32ProcessID;聽聽
聽聽聽聽聽聽聽 if(str1=="***.exe")//***.exe灝辨槸浣犺緇撴潫鐨勮繘紼嬬殑鍚嶇О聽
聽聽聽聽聽聽聽 {聽
聽聽聽聽聽聽聽聽聽聽聽 HANDLE ProcessHandle;聽
聽聽聽聽聽聽聽聽聽聽聽 ProcessHandle=OpenProcess (PROCESS_ALL_ACCESS,FALSE,ProcessID[m_nProcess]);聽
聽聽聽聽聽聽聽聽聽聽聽 TerminateProcess(ProcessHandle,0);聽聽聽聽聽
聽聽聽聽聽聽聽 }聽
聽聽聽聽聽聽聽 Status=Process32Next(SnapShot,&ProcessInfo);聽
聽聽聽聽聽聽聽 m_nProcess++;聽
聽聽聽 }聽
#define WM_DEBUG聽聽聽聽 WM_USER + 1999
2. 鍦ㄧ獥鍙eご鏂囦歡涓坊鍔?/p>
class CStreamServerDlg : public CDialog
{
聽// Generated message map functions
聽//{{AFX_MSG(CStreamServerDlg)
...
聽//}}AFX_MSG
聽afx_msg void OnDebug(WPARAM wParam, LPARAM lParam);聽
...
}
3. 鍦ㄧ獥鍙g殑cpp鏂囦歡涓坊鍔?/p>
BEGIN_MESSAGE_MAP(CStreamServerDlg, CDialog)
...
聽ON_MESSAGE(WM_DEBUG, OnDebug)
END_MESSAGE_MAP()
LRESULT聽 CStreamServerDlg::OnDebug(WPARAM wParam, LPARAM lParam)
{
}
4. 鍏朵粬鍦版柟灝卞彲浠ュ彂閫佹秷鎭?/p>
pWnd->PostMessage(WM_DEBUG,聽 (WPARAM)p, 0) )
璇存槑錛?br />
#define ON_MESSAGE(message, memberFxn)
{ message, 0, 0, 0, AfxSig_lwl,
(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn },