锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍚屾牱錛屽湪浠嬬粛MapGuide 鏈嶅姟鍣ㄥ浣曞鐞嗘灇涓捐祫婧愭搷浣滀箣鍓嶏紝璁╂垜浠鍏堟潵鐪嬬湅MapGuide 鏈嶅姟鍣ㄧ敤浜庡鐞嗘湇鍔¤姹傚拰鎿嶄綔鐨勭被錛屽浘19鈥?鏄劇ず鏈嶅姟璇鋒眰澶勭悊鍣ㄧ被鐨勭被鍥撅紝鍥?9鈥?0鏄劇ず浜嗘搷浣滃鐞嗗櫒綾葷殑綾誨浘銆?/p>
鍥?span class="Apple-converted-space">聽19鈥?1 鎿嶄綔澶勭悊鍣ㄧ被鐨勭被鍥?/p>
MapGuide鎻愪緵浜嗚祫婧愭湇鍔°佽绱犳湇鍔$瓑澶氱鏈嶅姟錛屾瘡縐嶆湇鍔″寘鍚簡澶ч噺鎿嶄綔銆侻apGuide涓烘瘡縐嶆湇鍔℃彁渚涗簡涓涓湇鍔¤姹傚鐞嗗櫒綾伙紝鐢ㄤ簬澶勭悊榪欎簺鏈嶅姟鎵鎻愪緵鐨勬搷浣滐紝渚嬪MgResourceServiceHandler銆丮gFeatureServiceHanlder絳夈傝繖浜涚被閮界戶鎵胯嚜IMgServiceHandler錛屽茍涓斿疄鐜頒簡鏂規(guī)硶IMgServiceHandler::ProcessOperation(...)銆侻apGuide浣跨敤宸ュ巶綾籑gServiceHanlderFactory鏉ュ垱寤轟竴涓湇鍔¤姹傚鐞嗗櫒綾葷殑瀹炰緥錛岀粰瀹氫竴涓湇鍔D錛岃皟鐢ㄦ柟娉昅gServiceHandlerFactory::GetHandler(...)鍙互鍒涘緩瀵瑰簲鐨勬湇鍔¤姹傚鐞嗗櫒綾葷殑瀹炰緥銆?/p>
瀵逛簬鏈嶅姟涓殑姣忕鎿嶄綔錛孧apGuide涔熸彁渚涗簡鐩稿簲鐨勬搷浣滃鐞嗗櫒綾匯備粠鍥?9鈥?0鍙互鐪嬪埌錛屾搷浣滃鐞嗗櫒綾誨垎涓哄洓涓眰嬈★紝鏈楂樹竴灞傛槸綾籌MgOperationHandler錛屽畠鏄墍鏈夋搷浣滃鐞嗙被鐨勫熀綾伙紝絎簩灞傛槸綾籑gServiceOperation錛岀涓夊眰鏄被MgXXXOperation錛屸淴XX鈥濅唬琛ㄦ湇鍔″悕縐幫紝鍦ㄨ繖涓灞傛瘡縐嶇被鍨嬬殑鏈嶅姟閮芥湁涓涓搴旂殑綾伙紝渚嬪MgFeatureOperation銆丮gResourceOperation絳夛紝絎洓灞備負鐪熸璐熻矗宸ヤ綔鐨勬搷浣滃鐞嗗櫒綾伙紝姣忕鏈嶅姟涓殑姣忎釜鎿嶄綔閮芥湁涓涓搴旂殑鎿嶄綔澶勭悊鍣ㄧ被錛屾煇縐嶆湇鍔′腑鎿嶄綔澶勭悊鍣ㄧ被閮界戶鎵胯嚜鍚屼竴涓埗綾伙紝渚嬪MgEnumerateResource銆丮gSetResource閮界戶鎵胯嚜MgResourceOperation銆?/p>
鎺ヤ笅鏉ヨ鎴戜滑鐪嬬湅MapGuide鏈嶅姟鍣ㄥ浣曞鐞嗘灇涓捐祫婧愭搷浣滐紝榪欎釜鎿嶄綔嫻佺▼鐨勬椂搴忓浘濡傚浘 19鈥?1鎵紺恒?/p>
鍥?span class="Apple-converted-space">聽19鈥?2 MapGuide鏈嶅姟鍣ㄥ鐞嗘灇涓捐祫婧愭搷浣滅殑鏃跺簭鍥?/p>
1錛?鍦ㄧ嚎紼嬫睜涓壘涓涓┖闂茬殑綰跨▼鎵ц鎿嶄綔 MapGuide鏈嶅姟鍣ㄤ嬌鐢ㄤ簡澶氱嚎紼嬪拰綰跨▼姹犵殑鎶鏈潵鎻愰珮鎿嶄綔澶勭悊鍜屽搷搴旇姹傜殑鎬ц兘銆傚湪MapGuide鏈嶅姟鍣ㄥ惎鍔ㄦ椂錛屼細鍒涘緩涓涓搷浣滆姹傞槦鍒楀拰涓涓敤浜庡鐞嗘搷浣滆姹傜殑綰跨▼姹犮傚綋涓涓搷浣滆姹傝繘鍏ユ搷浣滈槦鍒楋紝MapGuide鏈嶅姟鍣ㄤ細鍦ㄧ嚎紼嬫睜涓壘涓涓┖闂茬殑綰跨▼鎵ц鎿嶄綔銆傚鏋滄病鏈夌┖闂茬殑綰跨▼錛岄偅涔堣繖涓搷浣滆姹備細澶勪簬絳夊緟鐘舵侊紝鐩村埌綰跨▼姹犱腑鏈変簡絀洪棽鐨勭嚎紼嬨?/p>
棣栧厛錛岃鎴戜滑鏌ョ湅涓涓嬫湇鍔″櫒鐨勫叆鍙e嚱鏁扮殑婧愪唬鐮侊紝鐪嬬湅鏈嶅姟鍣ㄦ槸濡備綍鍚姩鐨勩侻apGuide鏈嶅姟鍣ㄥ彲浠ュ儚鏅氱殑搴旂敤紼嬪簭涓鏍瘋繍琛岋紝榪樺彲浠ュ湪Windows鎿嶄綔緋葷粺鍙互榪愯涓篧indows鏈嶅姟錛屽湪Linux鎿嶄綔緋葷粺榪愯涓哄畧鎶よ繘紼嬶紝涓嬮潰鐨勪唬鐮佷腑鍙繚鐣欎簡榪愯涓烘櫘閫氬簲鐢ㄧ▼搴忛儴鍒嗙殑浠g爜銆?/p>
typedef ACE_Singleton SERVER; int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { int nResult = 0; ...... // 鍒濆鍖朅CE鏈嶅姟 ACE::init(); ...... // 鏍規(guī)嵁鍛戒護琛屽弬鏁版墽琛屽搷搴旂殑鎿嶄綔 if((ACE_OS::strcasecmp(parameter, ACE_TEXT("?")) == 0) || (ACE_OS::strcasecmp(parameter, MG_WCHAR_TO_TCHAR(MgResources::ServerCmdHelp)) == 0)) { // 鏄劇ず鏈嶅姟鍣ㄥ懡浠よ鍙傛暟 ShowCommandlineHelp(); ...... } else if((ACE_OS::strcasecmp(parameter, MG_WCHAR_TO_TCHAR(MgResources::ServerCmdRun)) == 0) || (ACE_OS::strcasecmp(parameter, MG_WCHAR_TO_TCHAR(MgResources::ServerCmdInteractive)) == 0)) { ACE_OS::printf(MG_WCHAR_TO_CHAR(MgResources::ServerCmdRunInfo)); ...... // 浠ユ櫘閫氬簲鐢ㄧ▼搴忕殑鏂瑰紡榪愯鏈嶅姟鍣?/p>
nResult = SERVER::instance()->init(argc, argv); if(0 == nResult) { // 鍚姩鏈嶅姟 nResult = SERVER::instance()->open(); // 緇堟鏈嶅姟 SERVER::instance()->fini(); } ...... } ...... // 緇堟ACE鏈嶅姟 ACE::fini(); return nResult; }
鍦ㄤ笂闈㈢殑浠g爜涓紝鎴戜滑鍙互鐪嬪埌澶ч噺浠モ淎CE鈥濅負鍓嶇紑鐨勭被錛岃繖浜涚被鏄疉CE鑷傞厤閫氫俊鐜錛圓daptive Communication Environment錛夊伐鍏峰寘涓殑綾匯侫CE鏄竴涓紑婧愮殑宸ュ叿鍖咃紝瀹冨疄鐜頒簡璁稿鐢ㄤ簬騫跺彂閫氫俊杞歡鐨勬牳蹇冩ā寮忋侫CE鐨勭洰鏍囩敤鎴鋒槸鍦║NIX鍜學(xué)in32騫沖彴涓婂紑鍙戦珮鎬ц兘閫氫俊鏈嶅姟鍜屽簲鐢ㄧ殑寮鍙戣呫侫CE綆鍖栦簡浣跨敤榪涚▼闂撮氫俊銆佷簨浠跺璺垎紱匯佹樉寮忓姩鎬侀摼鎺ュ拰騫跺彂鐨凮O緗戠粶搴旂敤鍜屾湇鍔$殑寮鍙戙侫CE鎻愪緵浜嗕竴緇勪赴瀵岀殑鍙鐢–++ Wrapper Facade錛堝寘瑁呭瑙傦級鍜屾鏋剁粍浠訛紝鍙法瓚婂縐嶅鉤鍙板畬鎴愰氱敤鐨勯氫俊杞歡浠誨姟錛屽叾涓寘鎷細浜嬩歡澶氳礬鍒嗙鍜屼簨浠跺鐞嗗櫒鍒嗘淳銆佷俊鍙峰鐞嗐佹湇鍔″垵濮嬪寲銆佽繘紼嬮棿閫氫俊銆佸叡浜唴瀛樼鐞嗐佹秷鎭礬鐢便佸垎甯冨紡鏈嶅姟鍔ㄦ侊紙閲嶏級閰嶇疆銆佸茍鍙戞墽琛屽拰鍚屾絳夈?/p>
綾籑gServer緇ф壙鑷狝EC宸ュ叿鍖呬腑鐨勭被ACE_NT_Service鎴朅CE_Service_Object錛屽搴斾簬鏈嶅姟鍣ㄧ殑涓葷嚎紼嬶紝鍥?9鈥?2鏄劇ず浜嗘湇鍔″櫒涓葷嚎紼嬬被鐨勭被鍥俱侻gServer::svc()鏄富綰跨▼鐨勫叆鍙o紝璋冪敤鏂規(guī)硶MgServer::open()浼氬惎鍔ㄤ富綰跨▼騫朵笖鎵ц鏂規(guī)硶MgServer::svc()錛岃皟鐢∕gServer::fini()浼氱粓姝富綰跨▼銆侻apGuide浣跨敤浜哠ingleton妯℃澘ACE_Singleton灝哅gServer灝佽涓轟竴涓崟瀹炰緥綾伙紝涓轟簡鏂逛究浣跨敤MapGuide浣跨敤typedef涓篈CE_Singleton瀹氫箟浜嗕竴涓埆鍚峉ERVER錛岃皟鐢ㄦ柟娉昐ERVER::instance()鍙互鍒涘緩綾籑gServer鐨勪竴涓疄渚嬨?/p>
鍥?span class="Apple-converted-space">聽19鈥?3 鏈嶅姟鍣ㄤ富綰跨▼綾葷殑綾誨浘 MgServer::svc()鏄富綰跨▼鐨勫叆鍙o紝璇ユ柟娉曚細鍒涘緩涓涓搷浣滆姹傞槦鍒楀拰涓涓敤浜庡鐞嗘搷浣滆姹傜殑綰跨▼姹狅紝瀹冪殑浠g爜濡備笅鎵紺恒備簨瀹炰笂錛岃鏂規(guī)硶榪樺畾涔変簡鍏跺畠綾誨瀷鐨勯槦鍒楀拰綰跨▼姹狅紝涓轟簡渚夸簬鐞嗚В鎴戜滑鐪佺暐鎺変簡榪欎簺浠g爜銆?/p>
int MgServer::svc() { MgServerManager* pServerManager = MgServerManager::GetInstance(); // 鍒涘緩綰跨▼綆$悊鍣ㄥ拰鎿嶄綔綰跨▼ ACE_Thread_Manager threadManager; MgOperationThread clientThreads(threadManager, pServerManager->GetClientThreads()); pServerManager->SetClientMessageQueue(clientThreads.msg_queue_); MgClientAcceptor clientAcceptor(clientAddr, ACE_Reactor::instance(), clientThreads.msg_queue_); nResult = clientAcceptor.Initialize(); if(nResult == 0) { // 鍚姩綰跨▼姹?/p>
nResult = clientThreads.Activate(); if(nResult == 0) { // 閫氱煡鎿嶄綔綰跨▼鍋滄鎵ц ACE_Message_Block* mb = new ACE_Message_Block(4); if(mb) { mb->msg_type(ACE_Message_Block::MB_STOP); clientThreads.putq(mb); } // 鍋滄鎿嶄綔綰跨▼ clientThreads.close(); // 絳夊緟鎵鏈夋搷浣滅嚎紼嬫墽琛屽畬鎴?/p>
threadManager.wait(); threadManager.close(); } } return nResult; }
涓婇潰鐨勪唬鐮佷腑鍒涘緩涓涓被MgOperationThread鐨勫疄渚嬶紝璇ュ璞″垱寤轟簡涓涓嚎紼嬫睜錛岀淮鎶や簡涓涓搷浣滆姹傞槦鍒椼傜被MgOperationThread 緇ф壙鑷狝CE宸ュ叿鍖呬腑鐨勬ā鏉跨被AEC_Task錛屽搴斾簬鎿嶄綔綰跨▼錛屽浘19鈥?3鏄劇ず浜嗘搷浣滅嚎紼嬬被鐨勭被鍥俱侫CE_Task灝佽浜嗕換鍔★紝姣忎釜浠誨姟閮藉惈鏈変竴鎴栧涓嚎紼嬶紝浠ュ強涓涓簳灞傛秷鎭槦鍒椼傛柟娉旳CE_Task::svc()鏄嚎紼嬬殑鍚姩鍏ュ彛錛岃皟鐢ㄦ柟娉旳CE_Task::open()鐢ㄤ簬鍒濆鍖栦換鍔★紝璋冪敤鏂規(guī)硶ACE_Task::close()鐢ㄤ簬緇堟浠誨姟錛岃皟鐢ㄦ柟娉旳CE_Task::activate()鐢ㄤ簬鍚姩綰跨▼錛岃皟鐢ㄦ柟娉旳CE_Task::putq()鏀劇疆娑堟伅鍒頒換鍔$殑娑堟伅闃熷垪涓紝璋冪敤鏂規(guī)硶ACE_Task::getq()浠庝換鍔$殑娑堟伅闃熷垪涓彇鍑烘秷鎭?/p>
鍥?span class="Apple-converted-space">聽19鈥?4 鎿嶄綔綰跨▼綾葷殑綾誨浘 鏂規(guī)硶MgOperationThread::svc()鏄搷浣滅嚎紼嬬殑鍏ュ彛錛屽畠鐨勪唬鐮佸涓嬫墍紺恒?/p>
int MgOperationThread::svc() { INT32 nResult = 0; while (m_bActive) { ACE_Message_Block* messageBlock = NULL; // 浠庢秷鎭槦鍒椾腑鍙栧嚭娑堟伅 while (getq(messageBlock) == -1) { ...... } if(messageBlock->msg_type() == ACE_Message_Block::MB_STOP) { m_bActive = false; ACE_Message_Block* mb = new ACE_Message_Block(4); if(mb) { mb->msg_type(ACE_Message_Block::MB_STOP); putq(mb); } } else if(messageBlock->msg_type() ==聽ACE_Message_Block::MB_DATA) { MgServerStreamData* pData = dynamic_cast(messageBlock->data_block()); IMgServiceHandler::MgProcessStatus stat =聽ProcessMessage(messageBlock); ...... } } return nResult; } IMgServiceHandler::MgProcessStatus MgOperationThread::ProcessMessage(ACE_Message_Block* pMB) { IMgServiceHandler::MgProcessStatus stat = IMgServiceHandler::mpsError; MgServerStreamData* pData = NULL; pData = (MgServerStreamData*) pMB->data_block(); ...... MgStreamParser::ParseStreamHeader(pData); MgStreamParser::ParseDataHeader(pData); MgPacketParser::MgPacketHeader pt = MgPacketParser::GetPacketHeader(pData); switch ( pt ) { case (MgPacketParser::mphOperation):
stat = ProcessOperation( pData );
break; ...... } return stat; }
浠庝笂闈㈢殑浠g爜鍙互鐪嬪埌錛屾柟娉昅gOperationThread::svc()浼氳皟鐢ㄦ柟娉昰etq(鈥?寰幆璁塊棶娑堟伅闃熷垪錛屽彇鍑虹瓑寰呭鐞嗙殑娑堟伅銆傚鏋滄槸鏁版嵁綾誨瀷鐨勬秷鎭紝閭d箞璋冪敤鏂規(guī)硶MgOperationThread:: ProcessMessage(...)澶勭悊榪欎釜娑堟伅銆傛柟娉昅gOperationThread::ProcessMessage(...)浼氳В鏋愯繖涓秷鎭殑澶村拰鏁版嵁錛屽鏋滄秷鎭暟鎹腑鍖呭惈浜嗕竴涓搷浣滆姹傦紝閭d箞璋冪敤鏂規(guī)硶MgOperationThread:: ProcessOperation(鈥?澶勭悊榪欎釜鎿嶄綔璇鋒眰銆?/p>
2錛?澶勭悊鏈嶅姟璇鋒眰 鏂規(guī)硶MgOperationThread::ProcessOperation(鈥? 棣栧厛浼氳В鏋愭秷鎭暟鎹腑鐨勬湇鍔D銆佹搷浣淚D銆佹搷浣滅殑鐗堟湰鍙風(fēng)瓑淇℃伅錛岀劧鍚庢牴鎹湇鍔D浣跨敤宸ュ巶綾籑gServiceHanlderFactory鏉ュ垱寤轟竴涓湇鍔¤姹傚鐞嗗櫒綾葷殑瀹炰緥錛屾渶鍚庤皟鐢ㄨ繖涓湇鍔¤姹傚鐞嗗櫒綾葷殑鏂規(guī)硶IMgServiceHandler:: ProcessOperation(...)澶勭悊榪欎釜鏈嶅姟璇鋒眰銆?/p>
鏈妭鐨勭ず渚嬩腑瀹㈡埛绔彂閫佺殑鏄竴涓灇涓捐祫婧愮殑鎿嶄綔璇鋒眰錛屾墍浠ュ伐鍘傜被浼氬垱寤轟竴涓狹gResourceServiceHandler鐨勫疄渚嬶紝璋冪敤鏂規(guī)硶MgResourceServiceHandler::ProcessOperation(...)澶勭悊榪欎釜鏈嶅姟璇鋒眰銆?/p>
IMgServiceHandler::MgProcessStatus MgOperationThread::ProcessOperation(MgServerStreamData* pData) { IMgServiceHandler::MgProcessStatus stat = IMgServiceHandler::mpsError; MgOperationPacket op; MgStreamHelper* pHelper = NULL; pHelper = pData->GetStreamHelper(); pHelper->GetUINT32(op.m_PacketHeader); pHelper->GetUINT32(op.m_PacketVersion); pHelper->GetUINT32(op.m_ServiceID); pHelper->GetUINT32(op.m_OperationID); pHelper->GetUINT32(op.m_OperationVersion); IMgServiceHandler* pServiceHandler = MgServiceHandlerFactory::Instance()->GetHandler(op.m_ServiceID, pData, op); delete pServiceHandler; pServiceHandler = NULL;
stat = pServiceHandler->ProcessOperation();
return stat; }
3錛?澶勭悊鎿嶄綔璇鋒眰 棣栧厛錛屾柟娉昅gResourceServiceHandler::ProcessOperation(...)浼氭牴鎹搷浣滆姹傜殑ID錛岃皟鐢ㄨ祫婧愭搷浣滃伐鍘傜被鐨勬柟娉昅gResourceOperationFactory::GetOperation(鈥?鍒涘緩鐩稿簲鐨勮祫婧愭湇鍔℃搷浣滅被MgOpEnumerateResources鐨勫疄渚嬨傜劧鍚庯紝璋冪敤MgOpEnumerateResources:: Initialize(...)鍒濆鍖栨灇涓捐祫婧愭搷浣滃鐞嗗櫒錛岃皟鐢ㄦ柟娉昅gServiceManager::RequestService(鈥?鍒涘緩鏈嶅姟鍣ㄨ祫婧愭湇鍔gServerResourceService鐨勫疄渚嬨傛渶鍚庯紝璋冪敤鏂規(guī)硶MgOpEnumerateResources::Execute()澶勭悊鎿嶄綔璇鋒眰錛岃鏂規(guī)硶浼氳皟鐢∕gServerResourceService::EnumerateResources(鈥?瀹為檯鎵ц鏋氫婦璧勬簮鐨勫姛鑳姐?/p>
IMgServiceHandler::MgProcessStatus MgResourceServiceHandler::ProcessOperation() { IMgServiceHandler::MgProcessStatus status = IMgServiceHandler::mpsError; auto_ptr handler; MG_TRY() handler.reset(MgResourceOperationFactory::GetOperation( m_packet.m_OperationID, m_packet.m_OperationVersion)); assert(NULL != handler.get()); handler->Initialize(m_data, m_packet); handler->Execute(); status = IMgServiceHandler::mpsDone; MG_CATCH(L"MgResourceServiceHandler.ProcessOperation") if (mgException != NULL && NULL != handler.get()) { status = (handler.get()->HandleException(mgException) ? IMgServiceHandler::mpsDone : IMgServiceHandler::mpsError); } if (IMgServiceHandler::mpsDone != status) { MG_THROW(); } return status; } void MgOpEnumerateResources::Execute() { ...... BeginExecution(); ...... Validate(); Ptr byteReader = m_service->EnumerateResources(resource, depth, type, properties, fromDate, toDate, computeChildren); EndExecution(byteReader); ...... }
鏈妭涓紝鎴戜滑灝嗛氳繃浠嬬粛濡備綍瀹屾垚鏋氫婦璧勬簮鍔熻兘鏉ヤ粙緇峂apGuide Web鎵╁睍鐨勯儴鍒嗘簮浠g爜銆?/p>
鍦ㄦ祻瑙堝櫒绔殑鍦板潃鏍忚緭鍏ョ被浼煎涓嬪瓧絎︿覆錛屽氨浼氬彂閫佷竴涓灇涓捐祫婧愮殑HTTP璇鋒眰銆?/p>
http://hostname/mapGuide/mapagent.fcig?OPERATION=EnumerateResources&VERSION=1.0.0& RESOURCEID=Library:// &TYPE=FeatureSource&DEPTH=3
涓嬮潰鎴戜滑鏉ョ湅鐪婱apGuide Web鎵╁睍濡備綍澶勭悊榪欎釜璇鋒眰銆?/p>
鍦ㄤ粙緇峂apGuide Web鎵╁睍濡備綍澶勭悊鏋氫婦璧勬簮HTTP璇鋒眰涔嬪墠錛岃鎴戜滑棣栧厛鏉ョ湅鐪婱apGuide Web鎵╁睍鐢ㄤ簬澶勭悊HTTP璇鋒眰鍜屽搷搴旂殑綾伙紝榪欎簺綾葷殑綾誨浘濡傚浘19鈥?鎵紺恒?/p>
鍥?19鈥? HTTP璇鋒眰鍜屽搷搴旂被鐨勭被鍥?/p>
綾籑gHttpRequest鍜岀被MgHttpResponse鍒嗗埆鏄HTTP璇鋒眰鍜屽搷搴旂粨鏋滅殑鎶借薄錛岃繖涓や釜綾誨彲浠ョ敤浜庝換浣曠被鍨嬬殑Web搴旂敤鏈嶅姟鍣紝涔熷氨鏄瀹冧滑鐨勪唬鐮佷笉渚濊禆浜庝換浣昗eb搴旂敤鏈嶅姟鍣ˋPI銆傚湪鏂囦歡澶光淺MgDev\Web\src\HttpHandler鈥濅笅鍙互鎵懼埌鎵鏈夊墠緙涓衡淢gHttp鈥濈被鐨勬簮浠g爜銆?/p>
綾籑gHttpRequest鐢ㄤ簬澶勭悊HTTP璇鋒眰錛屽畠鍖呭惈浜嗕竴涓狧TTP璇鋒眰澶碝gHttpHeader鐨勫疄渚嬨佷竴涓狧TTP璇鋒眰鍙傛暟HttpRequestParam鐨勫疄渚嬪拰涓涓狧TTP璇鋒眰鍏冩暟鎹瓾ttpRequestMetadata鐨勫疄渚嬨傝皟鐢ㄦ柟娉昅gHttpRequest::Execute()浼氬皢HTTP璇鋒眰杞彂緇橫apGuide鏈嶅姟鍣紝褰揗apGuide鏈嶅姟鍣ㄥ鐞嗗畬榪欎釜璇鋒眰錛屽皢璇鋒眰緇撴灉榪斿洖緇橶eb鎵╁睍涔嬪悗錛岃繖涓柟娉曚細榪斿洖涓涓狹gHttpResponse瀵硅薄錛屽畠琛ㄧずHTTP璇鋒眰鐨勫搷搴旂粨鏋溿?/p>
鎺ヤ笅鏉ヨ鎴戜滑鐪嬬湅MapGuide Web鎵╁睍濡備綍澶勭悊鏋氫婦璧勬簮鐨凥TTP璇鋒眰銆傚ぇ澶氭暟MapGuide鐢ㄦ埛閮芥槸浣跨敤IIS浣滀負Web搴旂敤鏈嶅姟鍣紝騫朵笖浣跨敤Web鎵╁睍妯″潡isapi_MapAgent.dll鏉ュ鐞咹TTP璇鋒眰錛屾墍浠ユ湰鑺備晶閲嶄簬isapi_MapAgent.dll妯″潡澶勭悊HTTP璇鋒眰鐨勬祦紼嬶紝榪欎釜澶勭悊嫻佺▼鐨勬椂搴忓浘濡傚浘19鈥?鎵紺恒?/p>
]]>
1錛?鍔犺澆Web搴旂敤鏈嶅姟鍣ㄦ墿灞曟ā鍧?/p>
濡傛灉浣跨敤鐨勬槸IIS Web搴旂敤鏈嶅姟錛岄偅涔堝湪鎺ユ敹鍒板悗緙涓衡渇cgi鈥濈殑HTTP璇鋒眰鍚庯紝IIS浼氬姞杞絎eb搴旂敤鏈嶅姟鍣ㄦ墿灞曟ā鍧梚sapi_MapAgent.dll鎴朚apAgent.exe銆傚叾涓紝isapi_MapAgent.dll鍩轟簬IIS API錛屽叿鏈夋洿濂界殑鎬ц兘錛汳apAgent.exe鍩轟簬CGI鎶鏈紝鎬ц兘瑕佺◢寰樊涓浜涖傚鏋滀嬌鐢ㄧ殑鏄疉pache Web搴旂敤鏈嶅姟鍣紝閭d箞鍦╓indows騫沖彴涓夾pache浼氬姞杞絎eb搴旂敤鏈嶅姟鍣ㄦ墿灞曟ā鍧桵apAgent.exe錛屽湪Linux騫沖彴涓婁細鍔犺澆妯″潡mod_mgmapagent.so銆?/p>
榪欎笁涓猈eb鏈嶅姟鍣ㄦ墿灞曟ā鍧楀疄鐜頒簡綾諱技鐨勫姛鑳斤紝瀹冧滑鐨勬簮浠g爜浣嶇疆濡傝〃19鈥?鎵紺恒?/p>
鏈嶅姟鍣ㄦ墿灞曟ā鍧?/strong> |
婧愪唬鐮佷綅緗?/strong> |
isapi_MapAgent.dll |
\Web\src\IsapiAgent |
MapAgent.exe |
\Web\src\CgiAgent |
mod_mgmapagent.so |
\Web\src\ApacheAgent |
琛?span class="Apple-converted-space">聽19鈥? Web鏈嶅姟鍣ㄦ墿灞曟ā鍧楃殑婧愪唬鐮佷綅緗?/p>
浠庡浘19鈥?涓彲浠ョ湅鍒拌繖涓変釜Web鏈嶅姟鍣ㄦ墿灞曟ā鍧楁彁渚涗簡綾諱技鐨勭被錛岃繖浜涚被鎻愪緵浜嗙浉鍚岀殑鎺ュ彛錛岀被XXXPostParser鐢ㄤ簬瑙f瀽HTTP璇鋒眰涓紶鍏ョ殑鍙傛暟鍙婂弬鏁板鹼紝綾?strong>XXXResponseHandler鐢ㄤ簬灝咹TTP璇鋒眰鐨勫搷搴旂粨鏋滃彂閫佺粰瀹㈡埛绔傚叾涓紝鈥?strong>XXX鈥濊〃紺衡淐gi鈥濄佲淚sapi鈥濇垨鈥淎pache鈥濄?/p>
鍥?span class="Apple-converted-space">聽19鈥? Web鎵╁睍鐨勮姹傚鐞嗘ā鍧?/p>
瀵逛簬妯″潡isapi_MapAgent.dll錛屾瘡涓渇cgi鈥濈被鍨嬬殑HTTP璇鋒眰浼氳皟鐢ㄦ妯″潡涓殑鏂規(guī)硶HttpExtensionProc錛岃繖涓柟娉曠殑浠g爜濡備笅鎵紺猴紝涓轟簡渚夸簬鐞嗚В鎴戜滑鍙繚鐣欎簡涓浜涙牳蹇冧唬鐮併?/p>
DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB) { Initialize(pECB); // 璋冪敤GetServerVariable璇誨彇璇稿鏈嶅姟鍣ㄥ悕縐般佺鍙e彿絳夋湇鍔″櫒鍙橀噺淇℃伅 ...... // 鍒涘緩MgHttpRequest鐨勫疄渚嬶紝鐢ㄤ簬澶勭悊HTTP璇鋒眰 Ptr request = new MgHttpRequest(wUrl); // 瑙f瀽HTTP璇鋒眰涓殑鍙傛暟錛屽茍涓斿皢榪欎簺鍙傛暟緗叆MgHttpRequest瀵硅薄涓?/p> Ptr params = request->GetRequestParam(); ...... IsapiPostParser postParser(pECB); postParser.Parse(params); ...... // 鍒涘緩IsapiResponseHandler鐨勫疄渚嬶紝鐢ㄤ簬灝嗗搷搴旇姹傝繑鍥炵粰瀹㈡埛绔?/p> IsapiResponseHandler responseHandler(pECB); ...... // 灝咹TTP璇鋒眰杞彂緇橫apGuide鏈嶅姟鍣紝褰揗apGuide鏈嶅姟鍣ㄥ鐞嗗畬榪欎釜璇鋒眰錛?/p> // 灝嗚姹傜粨鏋滆繑鍥炵粰Web鎵╁睍涔嬪悗錛岃繖涓柟娉曚細榪斿洖涓涓狹gHttpResponse瀵硅薄錛?/p> // 瀹冭〃紺篐TTP璇鋒眰鐨勫搷搴旂粨鏋溿?/p> Ptr response = request->Execute(); // 灝嗗搷搴旂粨鏋滆繑鍥炵粰瀹㈡埛绔?/p> responseHandler.SendResponse(response); ...... } |
2錛?鍒涘緩MgHttpRequest鐨勫疄渚嬶紝鐢ㄤ簬澶勭悊HTTP璇鋒眰
鍦ㄥ姞杞絎eb搴旂敤鏈嶅姟鍣ㄦ墿灞曟ā鍧楀悗錛岄渶瑕佸垱寤轟竴涓狹gHttpRequest鐨勫疄渚嬬敤浜庡鐞咹TTP璇鋒眰銆傜被MgHttpRequest騫朵笉鍏寵仈涓庝換浣曠被鍨嬬殑Web搴旂敤鏈嶅姟鍣紝鎵浠eb搴旂敤鏈嶅姟鍣ㄦ墿灞曟ā鍧椾細浣跨敤綾?strong>XXXPostParser瑙f瀽HTTP璇鋒眰涓紶鍏ョ殑鍙傛暟鍙婂弬鏁板鹼紝灝嗚繖浜涘弬鏁拌緗埌MgHttpRequest瀵硅薄涓?/p>
3錛?璋冪敤鏂規(guī)硶MgHttpRequest::Execute()澶勭悊HTTP璇鋒眰
鏂規(guī)硶MgHttpRequest::Execute()鐨勬簮浠g爜濡備笅鎵紺恒備負浜嗕究浜庣悊瑙o紝鎴戜滑鍚屾牱鍙繚鐣欎簡涓浜涙牳蹇冧唬鐮併?/p>
MgHttpResponse* MgHttpRequest::Execute() { Ptr hResponse; Ptr result; // 鍒涘緩MgHttpResponse瀵硅薄錛岀敤浜庤繑鍥濰TTP璇鋒眰鍝嶅簲緇撴灉 hResponse = new MgHttpResponse(); result = hResponse->GetResult(); // 鑾峰緱HTTP璇鋒眰涓弬鏁扳淥PERATION鈥濈殑鍊?/p> STRING sParamValue = m_requestParam->GetParameterValue(MgHttpResourceStrings::reqOperation); ...... // 鏍規(guī)嵁鍙傛暟鈥淥PERATION鈥濈殑鍊煎彇寰楀搴旀搷浣滅殑璇鋒眰鍝嶅簲澶勭悊鍣?/p> Ptr rrHandler = CreateRequestResponseHandler(sParamValue, result); ....... // 澶勭悊HTTP璇鋒眰 if(rrHandler != NULL) rrHandler->Execute(*hResponse); ...... // 榪斿洖鍝嶅簲緇撴灉 return SAFE_ADDREF((MgHttpResponse*)hResponse); } |
姣忎釜HTTP璇鋒眰涓寘鍚竴涓弬鏁扳淥PERATION鈥濓紝瀹冪敤浜庝唬琛ㄦ搷浣滅殑綾誨瀷銆傚浜庝笉鍚岀殑鎿嶄綔錛孧apGuide瀹氫箟浜嗕笉鍚岀殑璇鋒眰鍝嶅簲澶勭悊鍣ㄧ被錛岃繖涓被浼氳皟鐢∕apGuide鏈嶅姟涓搴旂殑鏂規(guī)硶澶勭悊榪欎釜鎿嶄綔錛岃繖浜涜姹傚搷搴斿鐞嗗櫒綾葷殑綾誨浘濡傚浘19鈥?鎵紺恒備粠鍥?9鈥?鍙互鐪嬪埌錛屾墍鏈夎姹傚搷搴斿鐞嗗櫒綾婚兘緇ф壙鑷被MgHttpRequestResponseHandler錛屾瘡涓縐嶆搷浣滈兘鏈変竴涓搴旂殑瀛愮被錛屼緥濡傛灇涓捐祫婧愭搷浣滀嬌鐢ㄤ簡綾籑gHttpEnumerateResources錛屾弿榪版ā寮忔搷浣滀嬌鐢ㄤ簡綾籑gHttpDescribeSchema銆?/p>
鍥?span class="Apple-converted-space">聽19鈥? HTTP璇鋒眰鍝嶅簲澶勭悊鍣ㄧ殑綾誨浘
MapGuide瀹氫箟浜嗕竴涓叏灞map瀵硅薄鐢ㄤ簬瀛樻斁姣忕鎿嶄綔瀵瑰簲鐨勮姹傚搷搴斿鐞嗗櫒綾誨璞★紝瀹冪殑閿槸鎿嶄綔鐨勫悕縐幫紝鍊兼槸璇鋒眰鍝嶅簲澶勭悊鍣ㄧ被瀵硅薄銆?/p>
// 瀹氫箟涓涓叏灞map瀵硅薄錛岀敤浜庡瓨鏀炬瘡縐嶆搷浣滃搴旂殑璇鋒眰鍝嶅簲澶勭悊鍣ㄧ被瀵硅薄 static map httpClassCreators; bool InitializeStaticData() { httpClassCreators[MgHttpResourceStrings::opGetMap] = MgHttpGetMap::CreateObject; httpClassCreators[MgHttpResourceStrings::opGetMapUpdate] = MgHttpGetMapUpdate::CreateObject; httpClassCreators[MgHttpResourceStrings::opGetDrawing] = MgHttpGetDrawing::CreateObject; ...... httpClassCreators[MgHttpResourceStrings::opDescribeDrawing] = MgHttpDescribeDrawing::CreateObject; httpClassCreators[MgHttpResourceStrings::opEnumerateResources] = MgHttpEnumerateResources::CreateObject; ...... } |
璋冪敤鏂規(guī)硶MgHttpRequest::CreateRequestResponseHandler(...)鍙互鏍規(guī)嵁鎿嶄綔鐨勫悕縐拌幏寰楀搴旂殑璇鋒眰鍝嶅簲澶勭悊鍣ㄧ被瀵硅薄銆傚浜庢灇涓捐祫婧愭搷浣滐紝瀹冧細榪斿洖涓涓被MgHttpEnumerateResources鐨勫璞°?/p>
璋冪敤榪欎簺璇鋒眰鍝嶅簲澶勭悊鍣ㄧ被鐨凟xecute(鈥?鏂規(guī)硶錛屼細鍒涘緩涓涓唬鐞嗘湇鍔$被瀵硅薄錛岀劧鍚庤皟鐢ㄤ唬鐞嗘湇鍔′腑瀵瑰簲鐨勬柟娉曘備負浠涔堣鍒涘緩鐨勬槸涓涓唬鐞嗘湇鍔$被瀵硅薄鍛紵鎴戞兂鐪嬪畬鍥?9鈥?涔嬪悗澶у浼氭湁鎵鏄庣櫧銆備粠鍥?9鈥?涓彲浠ョ湅鍒幫紝鎵鏈夌殑MapGuide鏈嶅姟鏈変袱涓瓙綾伙紝涓涓槸鍚嶇О涓篗gProxyXXXService鐨勪唬鐞嗘湇鍔$被錛屽畠鏄疢apGuide Web鎵╁睍绔殑涓涓被錛屽彟涓涓槸鍚嶇О涓篗gServerXXXService鐨勬湇鍔″櫒鏈嶅姟綾伙紝瀹冩槸MapGuide鏈嶅姟鍣ㄧ鐨勪竴涓被銆侻gProxyXXXService鏈緇堜細灝嗘湇鍔¤姹傝漿鍙戠粰鏈嶅姟鍣ㄧ綾籑gServerXXXService錛屾墍浠ヨ鐪熸澶勭悊鏈嶅姟璇鋒眰鐨勭被鏄疢gServerXXXService錛孧gProxyXXXService浠呬粎璧峰埌涓涓漿鍙戠殑浣滅敤錛岃繖涔熷氨鏄負浠涔堢О綾籑gProxyXXXService涓轟唬鐞嗘湇鍔$被鐨勫師鍥犮?/p>
鍥?span class="Apple-converted-space">聽19鈥? 浠g悊鏈嶅姟鍜屾湇鍔″櫒鏈嶅姟綾葷殑綾誨浘
瀵逛簬鏋氫婦璧勬簮鎿嶄綔錛孧gHttpEnumerateResources::Execute(...)鐨勬簮浠g爜濡備笅鎵紺恒傝皟鐢ㄨ繖涓柟娉曚細鍒涘緩涓涓唬鐞嗚祫婧愭湇鍔$被MgProxyResourceService鐨勫璞★紝鐒跺悗璋冪敤MgProxyResourceService::EnumerateResources(...)鏋氫婦璧勬簮錛屾渶鍚庡皢鎿嶄綔鐨勬墽琛岀粨鏋滄斁鍏gHttpResponse瀵硅薄涓?/p>
void MgHttpEnumerateResources::Execute(MgHttpResponse& hResponse) { Ptr hResult; hResult = hResponse.GetResult(); // 媯鏌TTP璇鋒眰涓殑鍙傛暟 ValidateCommonParameters(); // 鍒涘緩MgProxyResourceService瀹炰緥 Ptr mgprService = (MgResourceService*)(CreateService(MgServiceType::ResourceService)); ...... // 鎵ц鏋氫婦璧勬簮鎿嶄綔 Ptr byteReader = mgprService-> EnumerateResources(&mgrIdentifier, m_depth, m_type, m_computeChildren); // 濡傛灉闇瑕侊紝杞崲鍝嶅簲璇鋒眰鐨勬牸寮?/p> ProcessFormatConversion(byteReader); // 灝嗘搷浣滅粨鏋滄斁鍏ュ搷搴旇姹備腑鐨凪gHttpResult瀵硅薄 hResult->SetResultObject(byteReader, byteReader->GetMimeType()); } MgByteReader* MgProxyResourceService::EnumerateResources( MgResourceIdentifier* resource, INT32 depth, CREFSTRING type, INT32 properties, CREFSTRING fromDate, CREFSTRING toDate, bool computeChildren) { MgCommand cmd; cmd.ExecuteCommand(m_connProp, MgCommand::knObject, MgResourceService::opIdEnumerateResources, 7, Resource_Service, BUILD_VERSION(1,0,0), MgCommand::knObject, resource, MgCommand::knInt32, depth, MgCommand::knString, &type, MgCommand::knInt32, properties, MgCommand::knString, &fromDate, MgCommand::knString, &toDate, MgCommand::knInt8, (int)computeChildren, MgCommand::knNone); SetWarning(cmd.GetWarningObject()); return (MgByteReader*)cmd.GetReturnValue().val.m_obj; } |
4錛?灝咹TTP璇鋒眰鐨勫搷搴旂粨鏋滆繑鍥炵粰瀹㈡埛绔?/p>
璋冪敤MgHttpRequest::Execute()浼氳繑鍥炰竴涓狹gHttpResponse瀵硅薄錛岃繖涓璞″寘鍚簡HTTP璇鋒眰鐨勫搷搴旂粨鏋溿備笉榪囷紝榪橀渶瑕佽皟鐢ㄦ柟娉?strong>XXXResponseHandler::SendResponse(...)錛岃繖鏍稺eb搴旂敤鏈嶅姟鍣ㄦ墠浼氬皢榪欎釜鍝嶅簲緇撴灉榪斿洖緇欏鎴風(fēng)銆?/p>
MapGuide 浠g爜鐨勪慨鏀瑰彲浠ュ垎涓轟袱澶х被錛氬姛鑳藉寮?/span> (Ehancement) 鍜岀己闄蜂慨姝?/span> (Defect) 錛?/span> MapGuide 浣跨敤 Tickets 鏉ョ鐞嗗拰璺熻釜榪欎簺淇敼錛岃闂?/span> http://trac.osgeo.org/mapguide/report 鍙互嫻忚鍜屾煡璇㈡椿鍔ㄧ殑鍜屽凡緇忓叧闂殑 Tickets 錛屽浜庡姛鑳藉寮?/span> MapGuide 榪樹嬌鐢ㄤ簡 RFC 榪涜綆$悊銆傞渶瑕佹敞鎰忕殑鏄棤璁哄垱寤?/span> Tickets 榪樻槸 RFC 錛岄兘闇瑕佹湁涓涓?/span> OSGeo 鐨勫笎鎴鳳紝浣跨敤 OSGeo 甯愭埛鐧誨綍鍚庢墠鍙互鍒涘緩 Tickets 鍜?/span> RFC 錛岃闂?/span> https://www.osgeo.org/cgi-bin/ldap_create_user.py 聽 鍙互娉ㄥ唽涓涓?/span> OSGeo 鐨勭敤鎴楓?/span>
1錛?/span> 聽聽 緙洪櫡淇
濡傛灉浣犲湪浣跨敤 MapGuide 鐨勮繃紼嬩腑鍙戠幇浜嗕竴涓?/span> Bug 錛岄偅涔堝彲浠ヨ冭檻鍒涘緩涓涓?/span> Ticket 銆傚湪鍒涘緩 Ticket 涔嬪墠錛屾渶濂借闂?/span> http://trac.osgeo.org/mapguide/search 鏌ユ壘鏄惁宸茬粡鏈夊叾浠栦漢鎻愪氦榪囩被浼肩殑 Ticket 錛屾垨鑰呯粰 mapguide-users 閭歡鍒楄〃鍙?/span> email 闂鏄惁瑙佸埌榪囩被浼奸棶棰樸傚湪涓轟竴涓?/span> Bug 鍒涘緩 Ticket 涔嬫椂錛岄渶瑕佹彁渚涗竴涓畬鏁寸殑銆佸彲浠ラ噸鐜?/span> Bug 鐨勬楠わ紝濡傛灉鍙兘鐨勮瘽鏈濂芥彁渚涗竴孌典唬鐮佺敤浜庨噸鐜?/span> Bug 錛屾渶鍚庡~鍐?/span> 鍥?/span> 18 鈥?span style="LINE-HEIGHT: 19px">3 鎵紺虹殑 Ticket 灞炴с傚叾涓紝 Priority 浠h〃 Bug 鐨勪紭鍏堢駭錛?/span> Component 浠h〃 Bug 鎵灞炵殑鍔熻兘緇勪歡錛?/span> Severity 浠h〃 Bug 鐨勪弗閲嶆э紝 Milestone 浠h〃淇浜?/span> Bug 鐨勭増鏈紝 Version 浠h〃鍙互閲嶇幇 Bug 鐨勭増鏈傛渶閲嶈鐨勬槸瑕佸~鍐欐紜殑 Version 鍊鹼紝濡傛灉涓嶆竻妤氶渶瑕佷負鍏朵粬灞炴у~鍐欎粈涔堟牱鐨勫鹼紝閭d箞鍙互灝嗗叾浠栧間繚鐣欎負絀猴紝鍦ㄥ叾浠栦漢媯闃呭拰鍒嗛厤榪欎釜 Bug 鏃朵細涓鴻繖浜涘睘鎬у~鍐欏悎閫傜殑鍊箋?/span>
聽
聽
18 鈥?/span> 3 聽Ticket鐨勫睘鎬?/span>2錛?/span> 聽聽 鍔熻兘澧炲己
濡傛灉瑕佹敼榪?/span> MapGuide 鐜版湁鐨勫姛鑳斤紝鎴栬呮坊鍔犱竴浜涙柊鐨勫姛鑳斤紝閭d箞闇瑕佸垱寤轟竴涓?/span> RFC 銆傝闂?/span> http://trac.osgeo.org/mapguide/wiki/MapGuideRfcs 鍙互嫻忚鐜版湁鐨?/span> RFC 錛岄氳繃榪欎簺 RFC 鎴戜滑鍙互浜嗚В MapGuide 鐨勬瘡涓増鏈坊鍔犱簡鍝簺鍔熻兘錛岀敋鑷充笅涓涓増鏈細娣誨姞鍝簺鏂扮殑鍔熻兘銆?/span> RFC 欏甸潰浣跨敤 Wiki 鐨勬柟寮忚繘琛岀淮鎶わ紝浣跨敤濡備笅鐨勬楠ゅ彲浠ュ垱寤轟竴涓柊鐨?/span> RFC 銆?/span>
1錛?/span> 聽聽 鐐瑰嚮鈥?/span> login 鈥濈櫥褰曘?/span>
2錛?/span> 聽聽 鐐瑰嚮鈥?/span> Edit this page 鈥濈紪杈?/span> RFC 鍒楄〃欏甸潰銆?/span>
3錛?/span> 聽聽 鍔犲叆濡備笅 Wiki 鏍煎紡鐨勫瓧絎︿覆銆傚叾涓紝鈥?/span> XX 鈥濅唬琛?/span> RFC 鐨勫簭鍙鳳紝鈥?/span> V.V 鈥濅唬琛ㄥ疄鐜?/span> RFC 鐨?/span> MapGuide 鐗堟湰鍙楓?/span>
||[wiki:MapGuideRfcXX MapGuide RFC XX - xxxxxxxxxxxx]||draft||V.V||
4錛?/span> 聽聽 鐐瑰嚮鈥?/span> Submit changes 鈥濇寜閽彁浜や慨鏀廣?/span>
5錛?/span> 聽聽 鐐瑰嚮瓚呴摼鎺モ?/span> MapGuide RFC XX 鈥濅細鍑虹幇涓涓柊鐨勯〉闈㈢敤浜庡垱寤烘柊鐨?/span> RFC 銆?/span>
6錛?/span> 聽聽 鍦ㄦ寜鐓?/span> RFC 妯℃澘鐨勬牸寮忓垱寤哄畬鎴愭柊鐨?/span> RFC 涔嬪悗錛屽彂 email 緇?/span> MapGuide 閭歡鍒楄〃 mapguide-internals@lists.osgeo.org 瑕佹眰 MapGuide 寮婧愮ぞ鍖虹殑浜轟滑璇勯槄姝?/span> RFC 銆?/span>
7錛?/span> 聽聽 鍦?/span> RFC 鍙戝竷涓鍛ㄥ悗錛屽茍涓旇В絳斾簡 MapGuide 寮婧愮ぞ鍖轟漢浠殑鎵鏈夐棶棰樹箣鍚庯紝鍙互瑕佹眰 PSC 鐨勬垚鍛樺姝?/span> RFC 鎶曠エ銆傚鏋滅敱澶氫簬涓や釜 PSC 鎴愬憳鍚屾剰姝?/span> RFC 錛屾病鏈変換浣?/span> PSC 鎴愬憳鍙嶅姝?/span> RFC 錛岄偅涔堟 RFC 灝辨姇紲ㄩ氳繃鍙互瀹炵幇浜嗐?/span>
8錛?/span> 聽聽 鍒涘緩涓涓被鍨嬩負鈥?/span> enhancement 鈥濈殑 Ticket 鐢ㄤ簬璺熻釜榪欎釜淇敼銆?/span>
鍦ㄤ慨姝d簡涓涓己闄鋒垨瀹炵幇浜嗕竴涓?/span> RFC 涔嬪悗錛岄渶瑕佸皢鐩稿簲鐨勪唬鐮佷慨鏀瑰垱寤轟負涓涓?/span> SVN Patch 鏂囦歡錛屽皢鍏朵笂浼犲埌鐩稿簲鐨?/span> Ticket 涓婁究浜庡紑婧愮ぞ鍖虹殑浜轟滑璇勯槄姝や慨鏀癸紝鍦ㄨ瘎闃呭畬鎴愪箣鍚庡氨鍙互鎻愪氦浠g爜浜嗐傚鏋滀綘涓嶆槸欏圭洰寮鍙?/span> 浜哄憳錛屾病鏈夋彁浜ゆ潈闄愶紝 欏圭洰寮鍙?/span> 浜哄憳浼氬府鍔╀綘鎻愪氦浠g爜鐨勩?/span>
浣滀負 OSGeo 鐨勪竴涓瓙欏圭洰錛?/span> MapGuide 閬靛畧涓庡叾浠?/span> OSGeo 欏圭洰鐨勭被浼肩殑綆$悊鏂瑰紡錛岀敱濡備笅鍥涚被緇勭粐鍜岃鑹茶繘琛岄」鐩殑寮鍙戝拰綆$悊銆?/span>
1錛?/span> 聽聽 欏圭洰絳瑰垝鎸囧濮斿憳 浼?span lang="EN-US" style="LINE-HEIGHT: 19px">(Project Steering Committee)
欏圭洰絳瑰垝鎸囧濮斿憳浼氱畝縐頒負 PSC 錛岃礋璐?/span> MapGuide 寮婧愰」鐩殑綆$悊宸ヤ綔錛屽喅瀹?/span> MapGuide 寮婧愮増鐨勫彂甯冩棩鏈熴佸摢浜涘姛鑳藉拰緙洪櫡淇鏁村悎鍒伴偅涓彂甯冪増鏈侀偅浜涗漢鍙互鎴愪負欏圭洰寮鍙戜漢鍛樼瓑錛岃屼笖 PSC 榪樿礋璐e畾鏈熶負 OSGeo 濮斿憳浼氭彁渚涢」鐩姸鍐墊姤鍛娿?/span>
2錛?/span> 聽聽 欏圭洰寮鍙?/span> 浜哄憳(Project Developer)
欏圭洰寮鍙戜漢鍛樺叿鏈?/span> MapGuide 婧愪唬鐮佺殑璇誨啓鏉冮檺錛岃兘澶熺洿鎺ヤ慨鏀?/span> MapGuide 鐨勬簮浠g爜錛屽茍涓旇礋璐f闃呴」鐩崘鍔╀漢鍛樼殑浠g爜錛屽府鍔╀粬浠彁浜や唬鐮併?/span>
3錛?/span> 聽聽 欏圭洰鎹愬姪 浜哄憳(Project Contributor)
欏圭洰鎹愬姪浜哄憳涔熸槸 MapGuide 鐨勫紑鍙戜漢鍛橈紝浣嗘槸娌℃湁 MapGuide 婧愪唬鐮佺殑淇敼鏉冮檺錛屼粬浠氳繃欏圭洰璺熻釜 (Tracker) 宸ュ叿涓?/span> MapGuide 璐$尞琛ヤ竵 (Patch) 銆佷唬鐮併佹枃。绛夊Q岄」鐩紑鍙戜漢鍛樹細媯闃呬粬浠殑淇敼錛屽拰浠栦滑榪涜浜ゆ祦錛屾渶鍚庡府鍔╀粬浠彁浜や唬鐮併傞氬父鎯呭喌涓嬶紝欏圭洰寮鍙戜漢鍛樻槸浠庨」鐩崘鍔╀漢鍛樼潃鎵嬪仛璧鳳紝鍦ㄩ」鐩崘鍔╀漢鍛樿礎(chǔ)鐚簡澶ч噺鏈変環(huán)鍊肩殑琛ヤ竵 (Patch) 涔嬪悗錛屼粬浼氳鎻愬悕涓洪」鐩紑鍙戜漢鍛橈紝鍦?/span> PSC 鎶曠エ鍚屾剰涔嬪悗錛屼粬灝變細姝e紡鎴愪負欏圭洰寮鍙戜漢鍛橈紝鍏鋒湁浜?/span> MapGuide 浠g爜鐨勪慨鏀規(guī)潈闄愩?/span>
4錛?/span> 聽聽 鐢?/span> 鎴?span lang="EN-US" style="LINE-HEIGHT: 19px">(Users)
聽聽聽 鐢ㄦ埛鏄?/span> MapGuide 鐨勪嬌鐢ㄨ咃紝浠栦滑鍩轟簬 MapGuide 榪涜浜屾寮鍙戙?/span>
濡傛灉鎯寵嚜宸辯紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide鐨勬簮浠g爜鍜岃繍琛?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide錛岄偅涔堣鍙傝?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide
寮婧愮増鐨勬枃妗?span lang="EN-US" style="LINE-HEIGHT: 19px">聽(http://mapguide.osgeo.org/documentation.html)錛屽悇涓増鏈?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide鐨勭紪璇戞楠ゅ熀鏈浉鍚岋紝浣嗘槸緇嗚妭鍗翠笉灝界浉鍚岋紝鎵浠ヨ鎵懼埌浣跨敤鐨勬簮浠g爜鎵瀵瑰簲鐨勬枃。锛屼弗鏍兼寜鐓ф枃。涓弿榪扮殑姝ラ緙栬瘧MapGuide銆?/span>鍥犱負MapGuide鏈嶅姟鍣ㄥ拰Web鎵╁睍鏄袱涓嫭绔嬬殑緇勪歡錛屾墍浠ュ畠浠篃鏄嫭绔嬬紪璇戠殑銆傜紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide鏈嶅姟鍣ㄧ粍浠剁殑鍩烘湰姝ラ濡備笅錛?/span>
1錛?/span> 聽 緙栬瘧FDO
MapGuide 浣跨敤浜?span lang="EN-US" style="LINE-HEIGHT: 19px">FDO鏉ヨ闂?span lang="EN-US" style="LINE-HEIGHT: 19px">GIS鏁版嵁錛屼絾鏄?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide鐨勬簮浠g爜涓茍娌℃湁鍖呭惈FDO鐨勬簮浠g爜錛屾墍浠ラ渶瑕佸紑鍙戜漢鍛樿嚜宸變笅杞?span lang="EN-US" style="LINE-HEIGHT: 19px">FDO鐨勬簮浠g爜鍜岀紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">FDO銆?/span>
2錛?/span> 聽 璁劇疆鐜鍙橀噺
闇瑕佹敞鎰忕殑鏄笉鍚岀増鏈殑MapGuide婧愪唬鐮侀渶瑕佽緗笉鍚岀殑鐜鍙橀噺錛屾墍浠ヨ娉ㄦ剰鍙傝冨搴旂増鏈殑鏂囨。銆?/span>
3錛?/span> 聽 緙栬瘧CS-MAP
浠?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide寮婧愮増2.1涔嬪悗錛?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide浣跨敤CS-MAP鏇夸唬浜?span lang="EN-US" style="LINE-HEIGHT: 19px">PROJ4鏉ュ鐞嗗潗鏍囩郴銆傜幇鍦?span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP涔熸槸OSGeo鐨勪竴涓紑婧愰」鐩紝鍦ㄤ嬌鐢?span lang="EN-US" style="LINE-HEIGHT: 19px">SVN涓嬭澆MapGuide婧愮爜鐨勬椂鍊欎細鑷姩涓嬭澆CS-MAP鐨勪唬鐮侊紝涓嶈繃闇瑕佺敤鎴風(fēng)嫭绔嬬紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP銆?/span>
4錛?/span> 聽 緙栬瘧OEM
OEM 灝辨槸MapGuide鎵渚濊禆鐨勭涓夋柟緇勪歡錛屼緥濡?span lang="EN-US" style="LINE-HEIGHT: 19px">ACE銆?span lang="EN-US" style="LINE-HEIGHT: 19px">SWIG銆?span lang="EN-US" style="LINE-HEIGHT: 19px">DWF Toolkit銆?span lang="EN-US" style="LINE-HEIGHT: 19px">FDO銆?span lang="EN-US" style="LINE-HEIGHT: 19px">Oracle Berkeley DB XML絳夛紝MapGuide鏈嶅姟鍣ㄥ拰Web鎵╁睍閮戒緷璧栦簬OEM錛屾墍浠ュ湪緙栬瘧MapGuide鏈嶅姟鍣ㄥ拰Web鎵╁睍鏃墮兘闇瑕佺紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">OEM錛屼絾鏄彧闇瑕佺紪璇戜竴嬈°?/span>
鍦?span lang="EN-US" style="LINE-HEIGHT: 19px">Windows騫沖彴涓婏紝鎵撳紑鏂囦歡澶?span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Oem\涓嬬殑Visual Studio Solution鏂囦歡oem.sln灝卞彲浠ョ紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">OEM緇勪歡銆?/span>
5錛?/span> 聽 緙栬瘧MapGuide鏈嶅姟鍣?/span>
榪欓儴鍒嗕唬鐮佹槸MapGuide鏈嶅姟鍣ㄧ湡姝g殑浠g爜錛屽湪Window騫沖彴涓婃墦寮鏂囦歡澶?span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Server\涓嬬殑Visual Studio Solution鏂囦歡Server.sln灝卞彲浠ョ紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide鏈嶅姟鍣ㄣ?/span>
緙栬瘧MapGuide Web鎵╁睍鐨勬楠ゅ涓嬶細
1錛?/span> 聽 瀹夎JDK
MapGuide Web 鎵╁睍闇瑕佸畨瑁?span lang="EN-US" style="LINE-HEIGHT: 19px">Java JDK 1.3鎴栨洿楂樼殑鐗堟湰錛屽鏋滄病鏈夊畨瑁?span lang="EN-US" style="LINE-HEIGHT: 19px">JDK錛岃璁塊棶http://java.sun.com涓嬭澆瀹夎瀹冦?/span>
2錛?/span> 聽 璁劇疆鐜鍙橀噺
闇瑕佹敞鎰忕殑鏄笉鍚岀増鏈殑MapGuide婧愪唬鐮侀渶瑕佽緗笉鍚岀殑鐜鍙橀噺錛屾墍浠ヨ娉ㄦ剰鍙傝冨搴旂増鏈殑鏂囨。銆?/span>
3錛?/span> 聽 緙栬瘧OEM
OEM 緇勪歡鍙渶瑕佺紪璇戜竴嬈★紝濡傛灉鍦ㄧ紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide鏈嶅姟鍣ㄦ椂宸茬粡緙栬瘧浜?span lang="EN-US" style="LINE-HEIGHT: 19px">OEM錛岄偅涔堟棤闇閲嶆柊緙栬瘧銆?/span>
4錛?/span> 聽 緙栬瘧MapGuide Web鎵╁睍
榪欓儴鍒嗕唬鐮佹槸MapGuide Web鎵╁睍鐪熸鐨勪唬鐮侊紝鍦?span lang="EN-US" style="LINE-HEIGHT: 19px">Window騫沖彴涓婃墦寮鏂囦歡澶?span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Web\src涓嬬殑Visual Studio Solution鏂囦歡WebTier.sln灝卞彲浠ョ紪璇?span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide Web鎵╁睍銆?/span>
MapGuide 婧愪唬鐮佺殑鐩綍緇撴瀯濡?/span> 琛?/span> 18 鈥?span style="LINE-HEIGHT: 19px">1 鍜?/span> 鍥?/span> 18 鈥?span style="LINE-HEIGHT: 19px">2 鎵紺猴紝鍦ㄥ悗緇殑绔犺妭涓垜浠皢閲嶇偣浠嬬粛 Common 銆?/span> OEM 銆佹湇鍔″櫒鍜?/span> Web 鎵╁睍閮ㄥ垎鐨勬簮浠g爜銆?/span>
聽
鏂囦歡澶?/span> |
鎻忚堪 |
Installer |
MapGuide 瀹夎紼嬪簭鐨勬簮浠g爜銆?/span> |
MgDev |
MapGuide 鏈嶅姟鍣ㄥ拰 Web 鎵╁睍鐨勬簮浠g爜銆?/span> |
聽聽BuildTools |
l 聽聽 緙栬瘧 MapGuide 闇瑕佷嬌鐢ㄧ殑涓浜涘伐鍏楓?/span> |
聽聽Common |
l 聽聽 MapGuide 鏈嶅姟鍣ㄥ拰 Web 鎵╁睍鍏卞悓渚濊禆鐨勪竴浜涙ā鍧椼?/span> |
聽聽Doc |
l 聽聽 MapGudie 鏂囨。銆佸簲鐢ㄧ▼搴忕ず渚嬪拰鐢熸垚 MapGuide 鏂囨。闇瑕佺敤鍒扮殑宸ュ叿銆?/span> |
聽聽OEM |
l 聽聽 MapGuide 鎵渚濊禆鐨勭涓夋柟緇勪歡銆?/span> |
聽聽Server |
l 聽聽 MapGuide 鏈嶅姟鍣ㄧ殑婧愪唬鐮併?/span> |
聽聽UnitTest |
l 聽聽 MapGuide Web 鎵╁睍鍗曞厓嫻嬭瘯浠g爜銆?/span> |
聽聽Web |
l 聽聽 MapGuide Web 鎵╁睍鐨勬簮浠g爜銆?/span> |
Tools |
MapGuide Maestro 鐨勬簮浠g爜錛屽叧浜?/span> Maestro 鏇磋緇嗙殑淇℃伅璇峰弬鑰?/span> 2.1.3.2.2 銆?/span> |
18 鈥?/span> 1 聽MapGuide婧愪唬鐮佺洰褰曠粨鏋?/span>
聽
聽
濡傛灉瑕佽闂?/span> MapGuide 鐨勬簮浠g爜錛岄渶瑕佸厛瀹夎涓涓?/span> Subversion 鐨勫鎴風(fēng)錛岄氳繃 Subversion 鐨勭綉绔?/span> ( http://subversion.tigris.org/ ) 鍙互浜嗚В鍒板叧浜?/span> Subversion 鏈涓鴻灝界殑淇℃伅銆備竴鑸儏鍐典笅錛屾帹鑽愬ぇ瀹朵嬌鐢?/span> TortoiseSVN 璁塊棶 MapGuide 鐨勬簮浠g爜錛屽畠?yōu)?/span> SVN 瀹㈡埛绔拰 Windows Shell 寰堝ソ鍦版暣鍚堝湪涓璧鳳紝鍦?/span> TortoiseSVN 鐨勭綉绔?/span> ( http://tortoisesvn.tigris.org/ ) 涓婂彲浠ヤ笅杞藉埌鏈鏂扮増鏈殑 TortoiseSVN 銆?/span>
Subversion 浠撳偍鐨勪綅緗負 http://svn.osgeo.org/mapguide/ 錛屽湪 Windows Shell 涓偣鍑婚紶鏍囧彸閿紝閫夋嫨鑿滃崟鈥?/span> SVN Checkout 鈥濆皢鏄劇ず濡?/span> 鍥?/span> 18 鈥?span style="LINE-HEIGHT: 19px">1 鎵紺虹殑鐢ㄦ埛鐣岄潰錛屽湪鈥?/span> Checkout Directory 鈥濅腑杈撳叆浠g爜涓嬭澆浣嶇疆錛岀劧鍚庣偣鍑燴?/span> OK 鈥濇寜閽氨鍙互涓嬭澆 MapGuide 鐨勬簮浠g爜銆傚湪鈥?/span> Trunk 鈥濈洰褰曚笅鍖呭惈鐨勬槸 MapGuide 鏈鏂扮殑婧愪唬鐮侊紝鍦ㄢ?/span> branches 鈥濈洰褰曚笅鍖呭惈浜?/span> MapGuide 浠庣増鏈?/span> 1.0.0 鍒?/span> 2.1 鐨勬墍鏈夋簮浠g爜銆?/span>
聽
聽
18 鈥?/span> 1 聽TortoiseSVN鐢ㄤ簬Checkout浠g爜鐨勭敤鎴風(fēng)晫闈?/span>聽
濡傛灉浠呬粎鏄笇鏈涙祻瑙?/span> MapGuide 鐨勬簮浠g爜錛屽彲浠ヨ闂?/span> http://trac.osgeo.org/mapguide/browser 鍦ㄦ祻瑙堝櫒涓祻瑙?/span> MapGuide 鐨勬簮浠g爜銆?/span>
璁稿浜洪兘鐭ラ亾MapGuide鎻愪緵浜?NET銆丳HP鍜孞ava涓夌綾誨瀷鐨刉eb API錛屼絾鏄笉鐭ラ亾MapGuide鏄浣曞垱寤鴻繖涓夌綾誨瀷鐨凙PI鐨勩傝瘯鎯充竴涓嬶紝濡傛灉鍒嗗埆鍘誨垱寤鴻繖涓夌API錛岃繖灝嗘槸涓涓緢闅劇淮鎶ょ殑宸ヤ綔銆傛瘡嬈″鍔犳垨淇敼涓浜涘姛鑳斤紝灝遍渶瑕佸涓夌綾誨瀷鐨凙PI閮借繘琛屼慨鏀廣傛墍浠ワ紝MapGuide浣跨敤浜哠WIG鏉ヨ嚜鍔ㄧ敓鎴愯繖涓夌綾誨瀷鐨凙PI銆傛垜鎯寵繖涓椂鍊欒澶氫漢浼氶棶錛屼粈涔堟槸SWIG鍛紵鎴戞庝箞浠庢潵娌℃湁鍚榪囪繖涓笢涓滃憿錛佸叾瀹烇紝鎴戜篃鏄湪鍋歁apGuide寮鍙戠殑鏃跺欐墠寮濮嬩簡瑙WIG鐨勩傛墍浠ワ紝棣栧厛璁╂垜浠潵璁よ瘑涓涓婼WIG錛岀劧鍚庡啀鏉ョ湅MapGuide鏄浣曚嬌鐢⊿WIG鏉ョ敓鎴怉PI鐨勩?/p>
1. SWIG綆浠?/strong>
聽聽聽 SWIG鏄疭imple Wrapper and Interface Generator鐨勭緝鍐欙紝鏄竴涓府鍔╀嬌鐢–鎴栬匔++緙栧啓鐨勮蔣浠跺垱寤哄叾浠栫紪璇█鐨凙PI鐨勫伐鍏楓備緥濡傦紝鎴戞兂瑕佷負涓涓狢++緙栧啓鐨勭▼搴忓垱寤?NET API錛屼竴鑸儏鍐典笅鎴戝繀欏諱嬌鐢ㄦ墭綆++(Managed C++)鍘葷紪鍐欏ぇ閲忕殑浠g爜鎵嶈兘鐢熸垚瀹冪殑.NET API銆傛湁浜哠WIG錛岃繖涓満姊扮殑宸ヤ綔灝嗗彉寰楅潪甯哥畝鍗曘備綘鍙』瑕佷嬌鐢ㄤ竴涓帴鍙f枃浠跺憡璇塖WIG瑕佷負閭d簺綾誨垱寤?NET API錛孲WIG灝變細鑷姩甯綘鐢熸垚瀹冪殑.NET API銆傛槸涓嶆槸闈炲父鐨勯叿鍟婏紵
聽聽聽 褰撶劧錛孲WIG涓嶄粎浠呮敮鎸佸垱寤?NET API銆傛渶鏂扮増鏈殑SWIG鏀寔甯哥敤鑴氭湰璇█Perl銆丳HP銆丳ython銆乀cl銆丷uby鍜岄潪鑴氭湰璇█C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML浠ュ強R錛岀敋鑷蟲槸緙栬瘧鍣ㄦ垨鑰呮眹緙栫殑璁″垝搴旂敤錛圙uile, MzScheme, Chicken錛夈?/p>
聽聽聽 涓嬮潰鎴戜滑閫氳繃涓涓緥瀛愭潵鐪嬬湅SWIG鏄浣曞府鎴戜滑鍒涘緩API鐨勩傚亣璁炬垜鎵撶畻涓哄涓嬬殑C++綾誨垱寤篊#鍜孞ava鐨凙PI銆?/p>
聽聽聽 /* SwigTest.h */
聽聽聽 class CSwigTest {
聽聽聽 public:
聽聽聽聽聽聽聽 CSwigTest();
聽聽聽 聽聽聽 virtual ~CSwigTest();
聽聽聽聽聽聽聽 int Add(int a, int b) { return a + b; }
聽聽聽 聽聽聽 int Substract(int a, int b) { return a - b; }
聽聽聽 聽聽聽 int Multiple(int a, int b) { return a * b; }
聽聽聽聽聽聽聽 float Divide(int a, int b) { return (float)a / (float)b; }
聽聽聽 };
1.1 鎺ュ彛鏂囦歡
聽聽聽 棣栧厛錛屼綘闇瑕佸啓涓涓帴鍙f枃浠?Interface File)錛屽憡璇塖WIG瑕佷負閭d簺綾葷殑閭d簺鏂規(guī)硶鍒涘緩API銆傚涓嬬殑鎺ュ彛鏂囦歡鍙負綾籆SwigTest鐨勬柟娉旳dd(...)鍜孲ubtract(...)鐢熸垚API錛屽洜涓哄湪鎺ュ彛鏂囦歡鐨勬帴鍙e0鏄庨儴鍒嗗彧澹版槑浜嗕袱涓柟娉曘?/p>
聽聽聽 /* SwigTest.i */
聽聽聽 %module SwigTest
聽聽聽 %{
聽聽聽 #include "SwigTest.h"
聽聽聽 %}
聽 聽 /*聽--- 鎺ュ彛澹版槑閮ㄥ垎 ---*/
聽聽聽 class CSwigTest {
聽聽聽 public:
聽聽聽聽聽聽聽 int Add(int a, int b);
聽聽聽聽聽聽聽 int Substract(int a, int b);
聽聽聽 };
聽聽聽 娉ㄨВ錛?module鏍囪鐢ㄤ簬瀹氫箟SWIG鐢熸垚鐨勬ā鍧楃殑鍚嶇О錛?{%}鏍囪涓殑鍐呭浼氳涓瀛椾笉宸湴鎻掑叆SWIG鑷姩鐢熸垚鐨勬枃浠秞xx_wrapper.c涓紝鍏朵腑xxx浠h〃鐢?module鎸囧畾鐨勬ā鍧楀悕縐般傝繖涓枃浠朵細鍦ㄤ笅闈粙緇嶏紝涓嶅繀鐫鎬ュ幓鐞嗚В瀹冪┒绔熸湁浠涔堜綔鐢ㄣ?/p>
聽聽聽 濡傛灉鎵撶畻涓虹被涓墍鏈夋柟娉曞垱寤篈PI錛岄偅涔堟湁涓涓潪甯哥畝鍗曠殑鍔炴硶錛屽湪鎺ュ彛鏂囦歡鐨勭被澹版槑閮ㄥ垎浣跨敤%include鏍囪銆係WIG灝嗗%include鎵鎸囧畾鐨勬枃浠惰繘琛岃娉曞垎鏋愶紝綾諱腑鎵鏈夊叕鏈夋柟娉?Public Method)閮藉皢鍦ˋPI涓毚闇層?/p>
聽聽聽 /* SwigTest.i */
聽聽聽 %module SwigTest
聽聽聽 %{
聽聽聽 #include "SwigTest.h"
聽聽聽 %}
聽聽聽 #include 鈥淪wigTest.h鈥澛?/p>
1.2 緙栬瘧妯″潡
聽聽聽 鏈変簡鎺ュ彛鏂囦歡涔嬪悗錛屽墿涓嬬殑浜嬪氨鏄墽琛屽嚑鏉″懡浠ゃ備笅闈㈡垜浠互Windows騫沖彴涓婄敓鎴?NET API涓轟緥浠嬬粛榪欎簺鍛戒護銆?/p>
聽聽聽 (a) 璋冪敤SWIG鑷姩鐢熸垚浠g爜
聽聽聽 swig -csharp聽 SwigTest.i
聽聽聽 鎵ц涓婇潰鐨勫懡浠や細浜х敓涓涓狢璇█鏂囦歡SwigTest_wrapper.c鍜屽涓狢#鏂囦歡銆傚湪鏂囦歡SwigTest_wrapper.c涓紝SWIG涓烘帴鍙f枃浠朵腑鎺ュ彛澹版槑閮ㄥ垎鎸囧畾鐨勬瘡涓柟娉曚駭鐢熶竴涓叏灞鏂規(guī)硶錛屼互渚緾#浣跨敤Pinvoke璋冪敤榪欎簺鍑芥暟銆傝岄偅浜汣#鏂囦歡灝辨槸鐢ㄦ潵鐢熸垚.NET API鐨勩?/p>
聽聽聽聽(b) 涓篊++浠g爜鐢熸垚DLL(鍔ㄦ侀摼鎺ュ簱)
聽聽聽 cl SwigTest_wrapper.c *.cpp
聽聽聽 link *.obj /out:SwigTest.dll
聽聽聽 鎵ц涓婇潰鐨勫懡浠わ紝浼氫負鎴戜滑緙栧啓C++浠g爜鐢熸垚DLL銆傚湪緙栬瘧C++鏂囦歡鏃訛紝涓瀹氳鍖呮嫭SWIG涓烘垜浠敓鎴愮殑C++鏂囦歡SwigTest_wrapper.cpp銆?/p>
聽聽聽 娉ㄦ剰錛氫負浜嗚澶у渚夸簬鐞嗚В涓婅堪鍛戒護錛岃繖浜涘懡浠ゅ茍娌℃湁鍒楀嚭瀹屾暣鐨勭紪璇戝拰閾炬帴閫夐」銆?/p>
聽聽聽聽(C) 鐢熸垚.NET妯″潡
聽聽聽 csc /out:SwigTestNotNetAPI.dll /target:library *.cs
聽聽聽 鎵ц涓婇潰鐨勫懡浠ゅ氨鐢熸垚浜?NET API妯″潡SwigTestNotNetAPI.dll銆傚鏋滅敤鎴鋒兂浣跨敤榪欎簺API錛屽彧闇瑕佹坊鍔犲SwigTestNotNetAPI.dll鐨勫紩鐢?Reference)灝卞彲浠ヤ簡銆?/p>
聽聽聽 鐢熸垚鍏跺畠璇█綾誨瀷API鐨勫懡浠ゅ熀鏈被浼鹼紝涓嬮潰鎴戜滑鍐嶄互Java鍦║nix騫沖彴涓嬬殑鍛戒護涓轟緥緇撴潫瀵筍WIG鐨勪粙緇嶃備簨瀹炰笂錛孲WIG涔熸槸涓涓紑婧愰」鐩傚鏋滄兂浜嗚В鏇村鍏充簬SWIG鐨勪俊鎭紝澶у鍙互鐧婚檰SWIG鐨勫畼鏂圭綉绔?a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" >www.swig.org錛岄偅閲屾湁SWIG鏈璇︾粏鐨勮祫鏂欍?br />聽聽聽聽$ swig -java SwigTest_wrapper.i
聽聽 聽$ gcc -c *.cpp SwigTest_wrapper.c -I/c/jdk1.3.1/include -I/c/jdk1.3.1/include/win32
聽聽 聽$ gcc -shared *.o -mno-cygwin -Wl,--add-stdcall-alias聽 -o SwigTest.dll
2. SWIG鍦∕apGuide涓殑搴旂敤
聽聽聽 鎴戜滑鍦ㄥ墠闈㈠凡緇忔彁鍒拌繃錛孧apGuide浣跨敤浜哠WIG鏉ヨ嚜鍔ㄧ敓鎴?NET銆丣ava鍜孭HP榪欎笁縐嶇被鍨嬬殑API銆備絾鏄紝SWIG涔熸湁涓嶅皯闄愬埗鍜岀己闄鳳紝鎵浠apGuide瀵筍WIG婧愪唬鐮佽繘琛屼簡澶ч噺鐨勪慨鏀癸紝浠ユ弧瓚寵嚜宸辯殑瑕佹眰銆備笅闈紝鎴戜滑鐪嬬湅榪欎簺鏀硅繘銆?/p>
2.1 IMake宸ュ叿
聽聽聽 SWIG瑕佹眰寮鍙戜漢鍛樼紪鍐欎竴涓帴鍙f枃浠訛紝閭d箞鑳藉惁璁╂帴鍙f枃浠惰嚜鍔ㄧ敓鎴愬憿錛熷熺敤涓鍙ヤ腑鍥界Щ鍔ㄧ殑騫垮憡璇嶏紝鎴戣兘錛佽櫧鐒禨WIG娌℃湁鎻愪緵榪欐柟闈㈢殑宸ュ叿錛屼絾鏄垜浠彲浠ヨ嚜宸卞紑鍙戝悧錛両Make(Interface Maker)灝辨槸涓轟簡婊¤凍榪欐牱鐨勮姹傝屽紑鍙戜竴涓伐鍏鳳紝緇欏畾涓涓猉ML鏂囦歡錛屽畠鑳藉府浣犺嚜鍔ㄧ敓鎴怱WIG鎺ュ彛鏂囦歡銆傜櫥褰昅apGuide寮婧愮増鐨勪唬鐮佹祻瑙堥〉闈?http://trac.osgeo.org/mapguide/browser)錛屽湪root/trunk/MgDev/BuildTools/WebTools/IMake鏂囦歡澶逛笅鍙互鎵懼埌IMake鐨勬簮浠g爜銆?/p>
聽聽聽聽 涓嬮潰鎴戜滑浠apGuide涓嬌鐢ㄧ殑XML鏂囦歡/trunk/MgDev/Web/src/MapGuideApi/MapGuideApiGen.xml涓轟緥錛屼粙緇嶄竴涓婭Make鐨勭敤娉曘備負浜嗕究浜庣悊瑙o紝鍦ㄦ鎴戝垹鎺変簡鏂囦歡涓殑閮ㄥ垎鍐呭銆?/p>
聽聽聽 <?xml version="1.0" encoding="UTF-8"?>
聽聽聽 <Parameters>
聽聽聽聽聽 <!-- 瀵瑰簲浜?Module鏍囪. -->
聽聽聽聽聽 <Module name="MapGuideApi" />
聽聽聽聽聽 <!-- 鐢熸垚鐨勬帴鍙f枃浠剁殑鍚嶇О. -->
聽聽聽聽聽 <Target path="./MapGuideApi.i" />
聽聽聽聽聽 <!-- 瀵瑰簲浜?{%}鏍囪 -->
聽聽聽聽聽 <CppInline>
聽聽聽聽聽聽聽 #include <string>
聽聽聽聽聽聽聽 #include <map>
聽聽聽聽聽聽聽 #include "MapGuideCommon.h"
聽聽聽聽聽聽聽 #include "WebApp.h"
聽聽聽聽聽聽聽 ......
聽聽聽聽聽 </CppInline>
聽聽聽聽聽 <!-- 鐢ㄤ簬鏇挎崲鎺ュ彛涓嬌鐢ㄧ殑閮ㄥ垎綾誨瀷 -->
聽聽聽聽聽 <TypeReplacements>
聽聽聽聽聽聽聽 <TypeReplacement oldtype="CREFSTRING" newtype="STRINGPARAM" />
聽聽聽聽聽聽聽 <TypeReplacement oldtype="INT64" newtype="long long" />
聽聽聽聽聽 </TypeReplacements>
聽聽聽聽聽 <!-- 姝ら儴鍒嗙殑鍐呭娣誨姞鍦?{%}涔嬪悗錛屾帴鍙e0鏄庨儴鍒嗕箣鍓?-->
聽聽聽聽聽 <SwigInline>
聽聽聽聽聽聽聽 %include "language.i"聽聽 //typemaps specific for each language
聽聽聽聽聽聽聽 ......
聽聽聽聽聽 </SwigInline>
聽聽聽聽聽聽
聽聽聽聽聽 <!-- 涓烘寚瀹氱殑C++鏂囦歡鐢熸垚鎺ュ彛澹版槑 -->
聽聽聽聽聽 <Headers>
聽聽聽聽聽聽聽 <Header path="../../../Common/Foundation/Data/Property.h" />
聽聽聽聽聽聽聽 ......
聽聽聽聽聽 </Headers>
聽聽聽 </Parameters>
聽聽聽 鎵ц鍛戒護鈥淚Make MapGuideApiGen.xml鈥濓紝IMake灝卞府鎴戜滑鑷姩鐢熸垚浜嗗涓婼WIG鎺ュ彛鏂囦歡MapGuideApi.i銆?/p>
聽聽聽 /* MapGuideApi.i */
聽聽聽 %module MapGuideApi聽
聽聽聽 %{
聽聽聽聽聽聽聽 #include <string>;
聽聽聽聽聽聽聽 #include <map>;
聽聽聽聽聽聽聽 #include "MapGuideCommon.h"
聽聽聽聽聽聽聽 #include "WebApp.h"
聽聽聽聽聽聽聽 ......
聽聽聽 %}
聽
聽聽聽 %include "language.i"聽聽 //typemaps specific for each language
聽聽聽 ......
聽聽聽 class MgProperty: public MgNamedSerializable
聽聽聽 {
聽聽聽 public:
聽聽聽聽聽聽聽 virtual INT16 GetPropertyType();
聽聽聽聽聽聽聽 STRING GetName();
聽聽聽聽聽聽聽 void SetName(CREFSTRING name);
聽聽聽 };
聽聽聽 ......
聽聽聽 濡傛灉鎵撳紑鏂囦歡Proper.h錛屾垜浠彲浠ョ湅鍒癕gProperty鏈夋洿澶氱殑鏂規(guī)硶錛屼緥濡侰anSetName(...)銆備負浠涔堝彧鏈変笁涓柟娉曟坊鍔犲埌浜哠WIG鎺ュ彛鏂囦歡涓紵IMake鍦ㄧ敓鎴愭帴鍙f枃浠舵椂錛屽畠浼氭煡鎵綜++澶存枃浠朵腑鐨勫畯PUBLISHED_API銆傚彧鏈夎PUBLISHED_API淇グ鐨勬柟娉曪紝鎵嶄細娣誨姞鍒版帴鍙f枃浠朵腑銆?/p>
聽聽聽 娉細瀹廝UBLISHED_API鍜孖NTERNAL_API鐨勫畾涔夊涓嬨?/p>
聽聽聽 #define PUBLISHED_API public
聽聽聽 #define INTERNAL_API public
聽聽聽 class MG_FOUNDATION_API MgProperty : public MgNamedSerializable聽
聽聽聽 {聽
聽聽聽 PUBLISHED_API:
聽聽聽聽聽聽聽 virtual INT16 GetPropertyType() = 0;聽 /// __get聽聽聽
聽聽聽聽聽聽聽 STRING GetName();聽 /// __get, __set聽
聽聽聽聽聽聽聽 void SetName(CREFSTRING name);聽
聽聽
聽聽聽 INTERNAL_API:聽
聽聽聽聽聽聽聽 virtual bool CanSetName();聽
聽聽
聽聽聽 protected:聽聽
聽聽聽聽聽聽聽 INT32 GetClassId();聽
聽聽聽聽聽聽聽 MgProperty();聽
聽聽聽聽聽聽聽 virtual ~MgProperty();聽
聽聽聽聽聽聽聽 virtual void Dispose();聽聽聽
聽聽聽聽聽聽聽 virtual void ToXml(string &str, bool includeType = true, string rootElmName = "Property") = 0;聽
聽聽
聽聽聽 private:聽
聽聽聽聽聽聽聽 friend class MgPropertyCollection;聽
聽聽聽聽聽聽聽 STRING m_propertyName;聽
聽
聽聽聽 CLASS_ID:聽
聽聽聽聽聽聽聽 static const INT32 m_cls_id = Foundation_Property_Property;聽
聽聽聽 };聽聽聽聽聽
聽聽聽 緇欏畾涓涓狢++甯擱噺瀹氫箟鏂囦歡錛孖Make榪樺彲浠ヨ嚜鍔ㄧ敓鎴愬搴旂殑鍏朵粬璇█鐨勫父閲忓畾涔夋枃浠躲侻apGuide .NET Web API涓殑鎵鏈夊父閲忛兘鏄嬌鐢↖Make鏉ョ敓鎴愮殑錛屼緥濡侻gMineType銆丮gPropertyType絳夈備笅闈㈡垜浠互MapGuide涓嬌鐢ㄧ殑XML鏂囦歡/trunk/MgDev/Web/src/MapGuideApi/Constants.xml涓轟緥錛屼粙緇嶅浣曡嚜鍔ㄧ敓鎴愬悇縐嶈璦鐨勫父閲忓畾涔夋枃浠躲傚悓鏍鳳紝涓轟簡渚夸簬鐞嗚В錛屽湪姝ゆ垜鍒犳帀浜嗘枃浠朵腑鐨勯儴鍒嗗唴瀹廣備笌MapGuideApiGen.xml涓嶅悓錛孋onstants.xml鍖呭惈涓涓柊鐨勫厓绱燙lasses鐢ㄦ潵鎸囧嚭闇瑕佸湪鐩爣璇█涓駭鐢熷搴旂殑甯擱噺綾葷殑C++綾匯?br />聽聽聽 <?xml version="1.0" encoding="UTF-8"?>
聽聽聽 <Parameters>
聽聽聽 <!-- 鐢ㄤ簬鏇挎崲綾誨瀷 -->
聽聽聽 <PHPTypeReplacements>聽
聽聽聽聽聽聽聽 <TypeReplacement oldtype="STRING" newtype="" />
聽聽聽聽聽聽聽 <TypeReplacement oldtype="INT16" newtype="" />
聽聽聽聽聽聽聽 ......
聽聽聽 </PHPTypeReplacements>
聽聽聽 <CSharpTypeReplacements>
聽聽聽聽聽聽聽 <TypeReplacement oldtype="STRING" newtype="string" />
聽聽聽聽聽聽聽 <TypeReplacement oldtype="INT16" newtype="short" />
聽聽聽聽聽聽聽 ......
聽聽聽 </CSharpTypeReplacements>
聽聽聽 <JavaTypeReplacements>
聽聽聽聽聽聽聽 <TypeReplacement oldtype="STRING" newtype="String" />
聽聽聽聽聽聽聽 <TypeReplacement oldtype="INT16" newtype="short" />
聽聽聽聽聽聽聽 ......
聽聽聽 </JavaTypeReplacements>
聽聽聽 <Namespace>OSGeo.MapGuide</Namespace>
聽聽聽 <Package>org.osgeo.mapguide</Package>
聽聽聽 <!--聽鐢ㄤ簬鎸囧嚭闇瑕佸湪鐩爣璇█涓駭鐢熷搴旂殑甯擱噺綾葷殑C++綾?-->
聽聽聽 <Classes>
聽聽聽聽聽聽聽 <Class name="MgMineType" />
聽聽聽聽聽聽聽 <Class name="MgPropertyType" />
聽聽聽聽聽聽聽 ......
聽聽聽 </Classes>
聽聽聽 <Headers>
聽聽聽聽聽聽聽 <Header path="../../../Common/Foundation/Data/MimeType.h" />
聽聽聽聽聽聽聽 <Header path="../../../Common/Foundation/Data/PropertyType.h" />
聽聽聽聽聽聽聽 ......
聽聽聽 </Headers>
聽聽聽 </Parameters>
聽聽聽 鎵ц鍛戒護鈥淚Make.exe Constants.xml C# Constants.cs鈥濓紝IMake灝卞府鎴戜滑鑷姩鐢熸垚浜嗕竴涓狢#甯擱噺鏂囦歡Constants.cs銆傚浜庢枃浠?trunk/MgDev/Common/Foundation/Data/PropertyType.h涓畾涔変簡濡備笅甯擱噺錛?/p>
聽聽聽 class MgPropertyType聽
聽聽聽 {聽
聽聽聽 PUBLISHED_API:聽聽
聽聽聽聽聽聽 static const int Null聽聽聽聽 =聽 0;
聽聽聽聽聽聽 static const int Boolean聽 =聽 1;聽
聽聽聽聽聽聽 static const int Byte聽聽聽聽 =聽 2;聽
聽聽聽聽聽聽 static const int DateTime =聽 3;
聽聽聽聽聽聽 static const int Single聽聽 =聽 4;聽
聽聽聽聽聽聽 ......
聽聽聽 };
聽聽聽 鍦ㄧ敓鎴愮殑Constants.cs鏂囦歡涓紝鏈夊涓嬬殑綾誨畾涔夈?br />聽聽聽 class MgPropertyType聽
聽聽聽 {聽
聽聽聽聽聽聽 static const int Null聽聽聽聽 =聽 0;
聽聽聽聽聽聽 static const int Boolean聽 =聽 1;聽
聽聽聽聽聽聽 static const int Byte聽聽聽聽 =聽 2;聽
聽聽聽聽聽聽 static const int DateTime =聽 3;
聽聽聽聽聽聽 static const int Single聽聽 =聽 4;聽
聽聽聽聽聽聽 ......
聽聽聽 };
聽聽聽 榪欎釜鏂囦歡鍙互琚獵#鐨勭紪璇戝櫒鐩存帴緙栬瘧錛屾墍浠apGuide娌℃湁浣跨敤SWIG鐢熸垚甯擱噺鐨凙PI錛岃屾槸鐩存帴浣跨敤IMake銆偮犲鏋滄兂鐢熸垚PHP鎴朖ava鐨勫父閲忓畾涔夋枃浠訛紝鍙渶瑕佸皢IMake鍛戒護鐨勫弬鏁?C#"鏇挎崲涓?PHP"鎴?Jave"灝卞彲浠ヤ簡銆?/p>
2.2 MapGuide瀵筍WIG鐨勪慨鏀?/strong>
聽聽聽 浜嬪疄涓婃渶鏂扮殑SWIG鐗堟湰涔熸病鏈夊叏閮ㄨВ鍐寵繖浜涢棶棰橈紝鎵浠apGuide瀵筍WIG婧愪唬鐮佽繘琛屼簡澶ч噺鐨勪慨鏀癸紝浠ユ弧瓚寵嚜宸辯殑瑕佹眰銆傜湅鐪婱apGuide鍦ㄤ嬌鐢⊿WIG鍛戒護鏄紶鍏ョ殑鍙傛暟錛屾垜浠彲浠ュ彂鐜版湁璁稿鍙傛暟涓嶆槸SWIG鏍囧噯鐨勫弬鏁幫紝渚嬪proxydir銆乧lsidcode銆乧lsiddata銆乧atchallcode絳夈?/p>
2.2.2 ClassId
3. 鎵╁睍MapGudie Web API
聽聽聽聽濡傛灉浣犲彂鐜扮幇鏈夌殑MapGuide Web API鏃犳硶婊¤凍浣犵殑瑕佹眰錛屾病鏈夊叧緋伙紝浣犲彲浠ュ幓灝濊瘯鎵╁睍瀹冿紝鍥犱負MapGuide鏄紑婧愮殑銆?/p>
聽聽聽 濡傛灉瑕佹柊娣葷被錛屽熀鏈楠ゅ涓嬶細 聽聽聽 濡傛灉瑕佹柊澧炲父閲忕被錛屽熀鏈楠ゅ涓嬶細 聽聽聽 <Classes>
聽聽聽 鍦∕apGuide寮濮嬩嬌鐢⊿WIG鐨勬椂鍊欙紝鍙敤鐨凷WIG鐨勬渶楂樼増鏈槸1.3.21錛屼粠閭d互鍚嶮apGuide鍦ㄦ病鏈夊崌綰ц繃SWIG銆傛墍浠ワ紝鍒扮幇鍦ㄤ負姝紝MapGuide鐨凷WIG鐗堟湰浠嶇劧鏄?.3.21銆傝繖涓増鏈殑SWIG鏈変笉灝戦檺鍒跺拰緙洪櫡錛?/p>
swig -c++ -csharp -dllname MapGuideUnmanagedApid -namespace OSGeo.MapGuide -proxydir .\custom -baseexception MgException -clsidcode getclassid.code -clsiddata m_cls_id -catchallcode catchall.code -dispose "((MgDisposable*)arg1)->Release()" -rethrow "e->Raise();" -nodefault -noconstants -module MapGuideApi -o MgApi_wrap.cpp -lib ..\..\..\Oem\SWIGEx\Lib MapGuideApi.i
聽聽聽 鍦ㄦ錛屾垜浠笉鎵撶畻涓涓浠嬬粛榪欎簺鍙傛暟錛屽洜涓哄湪澶氭暟鎯呭喌涓嬩綘娌℃湁蹇呰瀵逛簡瑙e弬鏁扮殑鍚箟銆傛垜浠彧浠嬬粛MapGuide鏄浣曟潵瑙e喅涓婅堪SWIG鐨勭浜屽拰絎笁涓棶棰樼殑錛屽洜涓哄湪鎵╁睍MapGuide Web API鐨勬椂鍊欎綘鍙兘浼氱敤寰楃潃銆?/p>
2.2.1 鍒涘緩灞炴?/strong>
聽聽聽 濡傛灉浣犵湅榪嘙apGuide婧愪唬鐮佺殑璇濓紝浣犱細鍙戠幇鏈夎澶氭柟娉曞0鏄庝箣鍚庢湁鈥淿_get鈥濄佲淿_set鈥濇垨鈥淿_get, __set鈥濊繖鏍風(fēng)殑娉ㄩ噴錛屽綾籑gProperty涓殑鏂規(guī)硶銆?br />聽聽聽 class MgProperty : public MgNamedSerializable聽
聽聽聽 {聽
聽聽聽 PUBLISHED_API:聽
聽聽聽聽聽聽聽 virtual INT16 GetPropertyType() = 0;聽 /// __get聽聽聽
聽聽聽聽聽聽聽 STRING GetName();聽 /// __get, __set聽
聽聽聽聽聽聽聽 void SetName(CREFSTRING name);聽
聽聽聽聽聽聽聽 ......
};
聽聽聽 榪欎簺娉ㄩ噴鏄湁鐗規(guī)畩鍚箟鐨勶紝瀹冧滑灝辨槸鐢ㄦ潵瑙e喅涓婅堪SWIG鐨勭浜屼釜闂鐨勩傚綋IMake宸ュ叿鎵弿C++澶存枃浠舵椂鍙戠幇榪欐敞閲婂悗錛屼細鍦ㄧ洰褰曗?\custom鈥濅笅涓烘瘡涓被浜х敓涓涓府鍔╁垱寤哄睘鎬х殑浠g爜鏂囦歡銆備緥濡傦紝濡傛灉瑕佺被MgProperty鐢熸垚.NET API錛孖Make浼氬湪鈥?\custom鈥濈敓鎴愪竴涓枃浠跺悕涓篗gProperty鐨凜#浠g爜鏂囦歡錛屽畠鐨勫唴瀹瑰涓嬶細
聽聽聽 public int PropertyType {
聽聽聽聽聽聽聽 get {return GetPropertyType(); }
聽聽聽 }
聽聽聽 public int Name {
聽聽聽聽聽聽聽 get { return GetPropertyType(); }
聽聽聽聽聽聽聽 set { setName(value);}
聽聽聽 }
聽聽聽 濡傛灉鍦⊿WIG鐨勫懡浠よ涓嬌鐢ㄤ簡鍙傛暟proxydir錛岄偅涔圫WIG鍦ㄤ負姣忎釜綾葷敓鎴愪唬鐮佺殑鏃跺欙紝浼氬湪proxydir鎵鎸囧畾鐨勭洰褰曚笅鏌ユ壘鍜岀被鍚嶇浉鍚岀殑鏂囦歡錛屽茍涓斿皢榪欎釜鏂囦歡涓殑浠g爜鎻掑叆綾葷殑鐩爣浠g爜涓傞氳繃榪欑鍔炴硶錛屽氨瑙e喅浜嗕笂榪癝WIG鐨勭浜屼釜闂銆?/p>
聽聽聽 MapGuide Web API涓殑鎵鏈夌被閮芥槸浠嶮gObject緇ф壙鑰屾潵鐨勶紝鍦ㄧ被MgObject涓湁涓涓柟娉旼etClassId()鐢ㄦ潵榪斿洖姣忎釜綾誨敮涓鐨処D鍊箋侻apGuide灝辨槸鐢ㄨ繖涓柟娉曟潵瑙e喅涓婅堪SWIG鐨勭涓変釜闂鐨勶紝鎵浠ュ鏋滆鍦∕apGuide Web API涓鍔犱竴涓柊綾伙紝涓瀹氳瑕嗙洊(override)榪欎釜鏂規(guī)硶錛屽茍涓旀彁渚涗竴涓敮涓鐨処D鍊箋?br />聽聽聽 class MgObject
聽聽聽 {
聽聽聽 EXTERNAL_API:
聽聽聽聽聽聽聽 virtual INT32 GetClassId();
聽聽聽聽聽聽聽 virtual STRING GetClassName();
聽聽聽 INTERNAL_API:
聽聽聽聽聽聽聽 virtual ~MgObject();
聽聽聽聽聽聽聽 bool IsOfClass(INT32 classId);
聽聽聽 };
聽聽聽 (a) 淇敼C++浠g爜錛屾坊鍔犳柊鐨勭被銆傚浜庨渶瑕佹毚闇蹭簬API鐨勬柟娉曪紝浣跨敤瀹廝UBLISHED_API淇グ銆?br />聽聽聽 (b) 淇敼XML鏂囦歡/trunk/MgDev/Web/src/MapGuideApi/MapGuideApiGen.xml鐨凥eaders閮ㄥ垎錛屼負姣忎釜鏂版坊鍔犵被鎵鍦ㄧ殑C++澶存枃浠跺鍔犱竴涓狧eader鍏冪礌銆備笅闈㈢殑紺轟緥涓紝"path"浠h〃C++澶存枃浠剁殑璺緞錛?filename.h"浠h〃鏂囦歡鐨勫悕縐般?br />聽聽聽 <Headers>
聽聽聽聽聽聽聽 <Header path="path/filename.h" />
聽聽聽聽聽聽聽 ......
聽聽聽 </Headers>
聽聽聽 (c) 閲嶆柊緙栬瘧MapGuide鐨刉eb妯″潡(/trunk/MgDev/Web/src/)銆?br />聽
聽聽聽 濡傛灉瑕佸鍔犱竴浜涙柊鐨勬柟娉曞埌鐜版湁鐨勭被涓紝鍩烘湰姝ラ濡備笅錛?br />聽聽聽 (a) 淇敼C++浠g爜錛屾坊鍔犳柊鐨勬柟娉曪紝騫朵笖浣跨敤瀹廝UBLISHED_API淇グ榪欎簺鏂規(guī)硶銆?br />聽聽聽 (b) 閲嶆柊緙栬瘧MapGuide鐨刉eb妯″潡(/trunk/MgDev/Web/src/)銆?/p>
聽聽聽 (a) 淇敼C++浠g爜錛屾坊鍔犳柊鐨勫父閲忕被銆?br />聽聽聽 (b) 淇敼XML鏂囦歡/trunk/MgDev/Web/src/MapGuideApi/Constants.xml錛屽湪Classes閮ㄥ垎涓烘瘡涓柊娣誨姞甯擱噺綾誨鍔犱竴涓狢lass鍏冪礌錛屽湪Headers閮ㄥ垎涓烘瘡涓柊娣誨姞甯擱噺綾繪墍鍦ㄧ殑C++澶存枃浠跺鍔犱竴涓狧eader鍏冪礌銆備笅闈㈢殑紺轟緥涓紝"ClassName"浠h〃鏂版坊鍔犵殑C++甯擱噺綾葷殑鍚嶇О銆?/p>
聽聽聽聽聽聽聽 <Class name="ClassName" />
聽聽聽聽聽聽聽 ......
聽聽聽 </Classes>
聽聽聽 <Headers>
聽聽聽聽聽聽聽 <Header path="path/filename.h" />
聽聽聽聽聽聽聽 ......
聽聽聽 </Headers>聽聽聽聽
聽聽聽 (c) 閲嶆柊緙栬瘧MapGuide鐨刉eb妯″潡(/trunk/MgDev/Web/src/)銆?/p>