![DEF文件的寫法_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a1.gif)
![DEF文件的寫法_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a2.gif)
![DEF文件的寫法_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a3.gif)
![DEF文件的寫法_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a4.gif)
![DEF文件的寫法_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a/c78fc27b-54ad-40e9-84a1-6f7f0a4ed38a5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、庫(kù)文件1.概論 先來(lái)闡述一下DLL(Dynamic Linkable Library)的概念,你可以簡(jiǎn)單的把DLL看成一種倉(cāng)庫(kù),它提供給你一些可以直接拿來(lái)用的變量、函數(shù)或類。在倉(cāng)庫(kù)的發(fā)展史上經(jīng)歷了“無(wú)庫(kù)靜態(tài)鏈接庫(kù)動(dòng)態(tài)鏈接庫(kù)”的時(shí)代。靜態(tài)鏈接庫(kù)與動(dòng)態(tài)鏈接庫(kù)都是共享代碼的方式,如果采用靜態(tài)鏈接庫(kù),則無(wú)論你愿不愿意,lib中的指令都被直接包含在最終生成的EXE文件中了。但是若使用DLL,該DLL不必被包含在最終EXE文件中,EXE文件執(zhí)行時(shí)可以“動(dòng)態(tài)”地引用和卸載這個(gè)與EXE獨(dú)立的DLL文件。靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的另外一個(gè)區(qū)別在于靜態(tài)鏈接庫(kù)中不能再包含其他的動(dòng)態(tài)鏈接庫(kù)或者靜態(tài)庫(kù),而在動(dòng)態(tài)鏈接庫(kù)中還
2、可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接庫(kù)。對(duì)動(dòng)態(tài)鏈接庫(kù),我們還需建立如下概念:(1)DLL 的編制與具體的編程語(yǔ)言及編譯器無(wú)關(guān)只要遵循約定的DLL接口規(guī)范和調(diào)用方式,用各種語(yǔ)言編寫的DLL都可以相互調(diào)用。譬如Windows提供的系統(tǒng)DLL(其中包括了Windows的API),在任何開(kāi)發(fā)環(huán)境中都能被調(diào)用,不在乎其是Visual Basic、Visual C+還是Delphi。(2)動(dòng)態(tài)鏈接庫(kù)隨處可見(jiàn)我們?cè)赪indows目錄下的system32文件夾中會(huì)看到kernel32.dll、user32.dll和gdi32.dll,windows的大多數(shù)API都包含在這些DLL中。kernel32.dll中的函數(shù)
3、主要處理內(nèi)存管理和進(jìn)程調(diào)度;user32.dll中的函數(shù)主要控制用戶界面;gdi32.dll中的函數(shù)則負(fù)責(zé)圖形方面的操作。一般的程序員都用過(guò)類似MessageBox的函數(shù),其實(shí)它就包含在user32.dll這個(gè)動(dòng)態(tài)鏈接庫(kù)中。由此可見(jiàn)DLL對(duì)我們來(lái)說(shuō)其實(shí)并不陌生。(3)VC動(dòng)態(tài)鏈接庫(kù)的分類Visual C+支持三種DLL,它們分別是Non-MFC DLL(非MFC動(dòng)態(tài)庫(kù))、MFC Regular DLL(MFC規(guī)則DLL)、MFC Extension DLL(MFC擴(kuò)展DLL)。非MFC動(dòng)態(tài)庫(kù)不采用MFC類庫(kù)結(jié)構(gòu),其導(dǎo)出函數(shù)為標(biāo)準(zhǔn)的C接口,能被非MFC或MFC編寫的應(yīng)用程序所調(diào)用;MFC規(guī)則DL
4、L 包含一個(gè)繼承自CWinApp的類,但其無(wú)消息循環(huán);MFC擴(kuò)展DLL采用MFC的動(dòng)態(tài)鏈接版本創(chuàng)建,它只能被用MFC類庫(kù)所編寫的應(yīng)用程序所調(diào)用。2.靜態(tài)鏈接庫(kù)對(duì)靜態(tài)鏈接庫(kù)的講解不是本文的重點(diǎn),但是在具體講解DLL之前,通過(guò)一個(gè)靜態(tài)鏈接庫(kù)的例子可以快速地幫助我們建立“庫(kù)”的概念。 用visual studio 創(chuàng)建動(dòng)態(tài)庫(kù)如圖1,在VC+6.0中new一個(gè)名稱為libTest的static library工程(單擊此處下載本工程),并新建lib.h和lib.cpp兩個(gè)文件,lib.h和lib.cpp的源代碼如下:/文件:lib.h#ifndef LIB_H#define LIB_Hextern &
5、quot;C" int add(int x,int y);/聲明為C編譯、連接方式的外部函數(shù)#endif/文件:lib.cpp#include "lib.h"int add(int x,int y)return x + y;編譯這個(gè)工程就得到了一個(gè).lib文件,這個(gè)文件就是一個(gè)函數(shù)庫(kù),它提供了add的功能。將頭文件和.lib文件提交給用戶后,用戶就可以直接使用其中的add函數(shù)了。標(biāo)準(zhǔn)Turbo C2.0中的C庫(kù)函數(shù)(我們用來(lái)的scanf、printf、memcpy、strcpy等)就來(lái)自這種靜態(tài)庫(kù)。下面來(lái)看看怎么使用這個(gè)庫(kù),在libTest工程所在的工作區(qū)內(nèi)new
6、一個(gè)libCall工程。libCall工程僅包含一個(gè)main.cpp文件,它演示了靜態(tài)鏈接庫(kù)的調(diào)用方法,其源代碼如下:#include <stdio.h>#include ".lib.h"#pragma comment( lib, ".debuglibTest.lib" ) /指定與靜態(tài)庫(kù)一起連接int main(int argc, char* argv)printf( "2 + 3 = %d", add( 2, 3 ) );靜態(tài)鏈接庫(kù)的調(diào)用就是這么簡(jiǎn)單,或許我們每天都在用,可是我們沒(méi)有明白這個(gè)概念。代碼中#pragma
7、comment( lib , ".debuglibTest.lib" )的意思是指本文件生成的.obj文件應(yīng)與libTest.lib一起連接。如果不用#pragma comment指定,則可以直接在VC+中設(shè)置,如圖2,依次選擇tools、options、directories、library files菜單或選項(xiàng),填入庫(kù)文件路徑。圖2中加紅圈的部分為我們添加的libTest.lib文件的路徑。 在VC中設(shè)置庫(kù)文件路徑這個(gè)靜態(tài)鏈接庫(kù)的例子至少讓我們明白了庫(kù)函數(shù)是怎么回事,它們是哪來(lái)的。我們現(xiàn)在有下列模糊認(rèn)識(shí)了:(1)庫(kù)不是個(gè)怪物,編寫庫(kù)的程序和編寫一般的程序區(qū)別不大,只是庫(kù)
8、不能單獨(dú)執(zhí)行;(2)庫(kù)提供一些可以給別的程序調(diào)用的東東,別的程序要調(diào)用它必須以某種方式指明它要調(diào)用之。以上從靜態(tài)鏈接庫(kù)分析而得到的對(duì)庫(kù)的懵懂概念可以直接引申到動(dòng)態(tài)鏈接庫(kù)中,動(dòng)態(tài)鏈接庫(kù)與靜態(tài)鏈接庫(kù)在編寫和調(diào)用上的不同體現(xiàn)在庫(kù)的外部接口定義及調(diào)用方式略有差異。 靜態(tài)庫(kù)目前以lib后綴的庫(kù)有兩種,一種為靜態(tài)鏈接庫(kù)(Static Libary,以下簡(jiǎn)稱“靜態(tài)庫(kù)”),另一種為動(dòng)態(tài)連接庫(kù)(DLL,以下簡(jiǎn)稱“動(dòng)態(tài)庫(kù)”)的導(dǎo)入庫(kù)(Import Libary,以下簡(jiǎn)稱“導(dǎo)入庫(kù)”)。 靜態(tài)庫(kù)是一個(gè)或者多個(gè)obj文件的打包,所以有人干脆把從obj文件生成lib的過(guò)程稱為Archive,即合并到一起。比如你鏈接一個(gè)靜
9、態(tài)庫(kù),如果其中有錯(cuò),它會(huì)準(zhǔn)確的找到是哪個(gè)obj有錯(cuò),即靜態(tài)lib只是殼子。 動(dòng)態(tài)庫(kù)一般會(huì)有對(duì)應(yīng)的導(dǎo)入庫(kù),方便程序靜態(tài)載入動(dòng)態(tài)鏈接庫(kù),否則你可能就需要自己LoadLibary調(diào)入DLL文件,然后再手工GetProcAddress獲得對(duì)應(yīng)函數(shù)了。有了導(dǎo)入庫(kù),你只需要鏈接導(dǎo)入庫(kù)后按照頭文件函數(shù)接口的聲明調(diào)用函數(shù)就可以了。 導(dǎo)入庫(kù)和靜態(tài)庫(kù)的區(qū)別導(dǎo)入庫(kù)和靜態(tài)庫(kù)的區(qū)別很大,他們實(shí)質(zhì)是不一樣的東西。靜態(tài)庫(kù)本身就包含了實(shí)際執(zhí)行代碼、符號(hào)表等等,而對(duì)于導(dǎo)入庫(kù)而言,其實(shí)際的執(zhí)行代碼位于動(dòng)態(tài)庫(kù)中,導(dǎo)入庫(kù)只包含了地址符號(hào)表等,確保程序找到對(duì)應(yīng)函數(shù)的一些基本地址信息。 這也是實(shí)際上很多開(kāi)源代碼發(fā)布的慣用方式: 1. 預(yù)
10、編譯的開(kāi)發(fā)包:包含一些.dll文件和一些.lib文件。其中這里的.lib就是導(dǎo)入庫(kù),而不要錯(cuò)以為是靜態(tài)庫(kù)。但是引入方式和靜態(tài)庫(kù)一樣,要在鏈接路徑上添加找到這些.lib的路徑。而.dll則最好放到最后產(chǎn)生的應(yīng)用程序exe執(zhí)行文件相同的目錄。這樣運(yùn)行時(shí),就會(huì)自動(dòng)調(diào)入動(dòng)態(tài)鏈接庫(kù)。 2. 用戶自己編譯: 下載的是源代碼,按照readme自己編譯。生成很可能也是.dll + .lib(導(dǎo)入庫(kù))的庫(kù)文件 3. 如果你只有dll,并且你知道dll中函數(shù)的函數(shù)原型,那么你可以直接在自己程序中使用LoadLibary調(diào)入DLL文件,然后使用GetProcAddress調(diào)用DLL中的函數(shù)。當(dāng)DLL被鏈接時(shí),鏈接程
11、序要查找關(guān)于輸出變量,函數(shù),或C+類的信息,并自動(dòng)生成一個(gè)lib文件。該lib文件包含一個(gè)DLL輸出的符號(hào)列表。如果要鏈接引用該DLL的輸出符號(hào)的任何可執(zhí)行模塊,該lib文件是必不可少的(使用GetProcAddress除外)。其實(shí)導(dǎo)入庫(kù)中并不含RVA(每個(gè)符號(hào)的相對(duì)虛擬地址),只是一些符號(hào)而已,還有關(guān)于這個(gè)lib所對(duì)應(yīng)的DLL的名字等。 (這只是我現(xiàn)在的理解)那當(dāng)應(yīng)用程序調(diào)用一個(gè)DLL的函數(shù)時(shí),是怎么進(jìn)行的呢?(使用lib的情況下)答案是在進(jìn)程的主線程開(kāi)始運(yùn)行之前,由加載器完成。加載器根據(jù)輸入節(jié)中DLL的名字按照windows的搜索路徑搜索DLL,找到后DLL映射到進(jìn)程的地址空間,這是DLL
12、中對(duì)應(yīng)于輸入節(jié)中的各個(gè)符號(hào)的地址就可以確定了,加載器在這個(gè)時(shí)候?qū)⒌刂分匦绿钊肟蓤?zhí)行模塊的輸入節(jié)中,動(dòng)態(tài)連接完成。DEF文件的寫法:LIBRARY BTREE / 庫(kù)名為BTREE,省略庫(kù)名即為動(dòng)態(tài)鏈接庫(kù)文件名EXPORTS / 輸出 Insert 1 / 帶序號(hào)的輸出函數(shù)名 Delete 2 Member
13、160; 3 Min 4Dynamic-Link Libraries概述Microsoft Windows DLL程序是包函數(shù)和數(shù)據(jù)的模塊。由調(diào)用它的其它模塊(EXE或DLL)動(dòng)態(tài)加載。加載時(shí),它被映像到調(diào)用模塊的地址空間內(nèi)。DLL可以定義兩類函數(shù):輸出函數(shù)和內(nèi)部函數(shù)。輸出函數(shù)可以被其它模塊調(diào)用??梢远x輸出數(shù)據(jù),但輸出數(shù)據(jù)一般只由它自己的函數(shù)使用。DLL有助于應(yīng)用程序?qū)崿F(xiàn)模塊化。當(dāng)多個(gè)應(yīng)用程序使用相同的模塊時(shí),還能減少內(nèi)存占用,原因是每個(gè)應(yīng)用程序會(huì)有自己的數(shù)據(jù)復(fù)本,DLL的代碼是共享的。動(dòng)態(tài)鏈接允許模塊只包含裝載時(shí)或運(yùn)行時(shí)系統(tǒng)需要的
14、信息,這點(diǎn)與靜態(tài)鏈接不同。靜態(tài)鏈接時(shí)系統(tǒng)會(huì)為每個(gè)調(diào)用模塊拷貝一份相應(yīng)的函數(shù)代碼。每個(gè)被裝載的DLL都由系統(tǒng)設(shè)置一個(gè)計(jì)數(shù)標(biāo)志。某個(gè)線程使用DLL時(shí),系統(tǒng)將這個(gè)計(jì)數(shù)值加1,線程結(jié)束時(shí),計(jì)數(shù)值減1。當(dāng)計(jì)數(shù)值減到0時(shí),系統(tǒng)將其從調(diào)用模塊的虛擬空間中卸載。使用DLL需要有如下規(guī)定:1.裝載DLL的線程可以使用該DLL打開(kāi)的句柄。同樣,調(diào)用模塊的線程打開(kāi)的其它句柄也可以由DLL使用。2.DLL使用調(diào)用線程的堆棧。3.DLL參考調(diào)用進(jìn)程的虛擬內(nèi)存定位地址。動(dòng)態(tài)鏈接形式使用DLL有兩種方法:1.啟動(dòng)裝載動(dòng)態(tài)鏈接。模塊直接調(diào)用DLL輸出函數(shù)。調(diào)用模塊事先必須用輸入函數(shù)表連接到DLL及其使用的其它DLL或庫(kù)。模塊
15、的輸入函數(shù)表會(huì)指導(dǎo)操作系統(tǒng),在應(yīng)用程序裝載時(shí)需要的DLL函數(shù)的信息和定位方式。2.運(yùn)行裝載動(dòng)態(tài)鏈接。調(diào)用模塊用LoadLibrary或LoadLibraryEx函數(shù)在運(yùn)行時(shí)刻裝載DLL。調(diào)用模塊用GetProcAddress函數(shù)等到DLL函數(shù)的句柄,用這個(gè)句柄調(diào)用其函數(shù)。這種方法不用輸入函數(shù)表。動(dòng)態(tài)鏈接的優(yōu)點(diǎn)相比靜態(tài)鏈接,動(dòng)態(tài)鏈接有幾個(gè)優(yōu)點(diǎn):1.多個(gè)進(jìn)程在同一基地址裝載相同DLL,只需要一個(gè)共享DLL即可,它在物理地址空間內(nèi)共享。2.DLL內(nèi)的函數(shù)變化,只要其輸入輸入?yún)?shù)、調(diào)用格式?jīng)]有變,應(yīng)用程序自身不必重新編譯。靜態(tài)鏈接需要重新編譯。3.DLL提供異步支持。比如應(yīng)用程序裝載DLL時(shí),用DLL
16、支持一個(gè)無(wú)效設(shè)備。4.不同語(yǔ)言編寫的應(yīng)用程序可以用約定的調(diào)用格式調(diào)用DLL函數(shù)。潛在缺點(diǎn)是應(yīng)用程序不是相對(duì)獨(dú)立的。啟動(dòng)裝載動(dòng)態(tài)鏈接時(shí),DLL不存在,程序不被裝載。運(yùn)行裝載時(shí),如果DLL不存在,由程序處理。創(chuàng)建動(dòng)態(tài)鏈接庫(kù)創(chuàng)建DLL需要一個(gè)或多個(gè)源文件,可能需要輸出函數(shù)用的連接文件。如果是啟動(dòng)裝載的DLL,還要?jiǎng)?chuàng)建輸入庫(kù)。源文件內(nèi)是輸出函數(shù)和內(nèi)部函數(shù),可選的DLL入口函數(shù)。DLL由多線程的應(yīng)用程序使用,要將DLL連接成thread-safe類型,以支持多線程,也要同步全局?jǐn)?shù)據(jù)。輸出函數(shù)的定義是需要編譯程序支持的,聲明方式也不相同。使用MS VC+,有兩種定義輸出函數(shù)的方式:源文件中使用_decls
17、pec 定義,或用.DEF文件定義。輸入庫(kù)(.LIB)文件包含連接程序需要的DLL輸出函數(shù),系統(tǒng)定位指定的DLL及其輸出函數(shù)。VC+中要指定該DLL的輸入庫(kù)文件(.LIB),才能編譯使用該DLL中的函數(shù)。DLL入口函數(shù)每個(gè)DLL必須有入口點(diǎn),并不必須有入口函數(shù),入口點(diǎn)由連接程序指定。應(yīng)用程序裝載或卸載DLL時(shí)系統(tǒng)會(huì)調(diào)用入口函數(shù)。一般在這里進(jìn)行初始化工作。參看DllEntryPoint函數(shù),用戶可以更改這個(gè)函數(shù)名,也要參看連接程序文檔。調(diào)用入口程序的事件:1.裝載DLL后。2.卸載DLL之前。3.進(jìn)程創(chuàng)建了一個(gè)新線程。使用DisableThreadLibraryCalls函數(shù)會(huì)取消這個(gè)動(dòng)作。4.
18、線程正常結(jié)束,不是使用TerminateThread或TerminateProcess函數(shù)。同一時(shí)刻只有一個(gè)線程允許調(diào)用DLL入口函數(shù)。DLL可以使用TLS(線程局部存貯表)獲得線程信息。定義格式:BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL, / handle to DLL module DWORD fdwReason, / reason for calling function
19、LPVOID lpReserved ) / reserved函數(shù)開(kāi)頭處,可以獲得系統(tǒng)傳遞的調(diào)用信息:A process loads the DLL (DLL_PROCESS_ATTACH). The current process creates a new thread (DLL_THREAD_ATTACH). A thread exits normally (DLL_THREAD_DETACH). A process unloads the DLL (DLL_PROCESS_DETACH)不定義入口函數(shù),裝載時(shí)會(huì)產(chǎn)生錯(cuò)誤。入口函數(shù)操作成功應(yīng)該返回TRUE。啟動(dòng)裝載DLL時(shí)的搜索路徑1.啟動(dòng)模塊路徑。2.當(dāng)前路徑。3.Windows系統(tǒng)路徑。GetSystemDirectory函數(shù)可以返回這個(gè)路徑。4.Windows路徑。GetWindowsDirectory函數(shù)返回這個(gè)路徑。5.PATH環(huán)境路徑。運(yùn)行裝載DLL不同路徑的重名DLL不會(huì)認(rèn)為是相同的DLL。 LoadLibrary 或 LoadLibraryEx函數(shù)會(huì)調(diào)用DLL入口函數(shù)。 GetModuleHandle 函數(shù)返回DLL句柄。GetProcAddress函數(shù)獲得地址。運(yùn)行時(shí)加載DLL,在DLL出錯(cuò)時(shí),應(yīng)用程序仍可運(yùn)行,但不能再使用該DLL中的函數(shù)。DLL的數(shù)據(jù)DLL缺省的變量使用范圍與
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人轉(zhuǎn)介紹合同范本
- 公司過(guò)戶合同范本
- 北京家政服務(wù)合同范本
- 代墊付工資合同范本
- 鄉(xiāng)鎮(zhèn)防汛物資購(gòu)銷合同范本
- 2023-2028年中國(guó)等離子手術(shù)刀行業(yè)市場(chǎng)調(diào)查研究及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 2025年度住宅小區(qū)工程質(zhì)量監(jiān)控服務(wù)合同
- 加工合同范本版
- 2025年中國(guó)船舶裝載機(jī)行業(yè)發(fā)展趨勢(shì)及投資前景預(yù)測(cè)報(bào)告
- 社會(huì)政策概論課件
- 工程量清單及招標(biāo)控制價(jià)編制服務(wù)采購(gòu)實(shí)施方案(技術(shù)標(biāo))
- 全國(guó)住戶收支調(diào)查業(yè)務(wù)知識(shí)考試復(fù)習(xí)題庫(kù)(含答案)
- 復(fù)方氨基酸注射液的匯總
- 2023年上海市秋考語(yǔ)文真題試卷含答案(整理版)
- 2023年心理咨詢師之心理咨詢師基礎(chǔ)知識(shí)考試題庫(kù)附完整答案【有一套】
- 一級(jí)建造師繼續(xù)教育最全題庫(kù)及答案(新)
- 直線加速器專項(xiàng)施工方案
- 聯(lián)苯二氯芐生產(chǎn)工藝及產(chǎn)排污分析
- 儲(chǔ)能設(shè)備項(xiàng)目采購(gòu)供應(yīng)質(zhì)量管理方案
- 美國(guó)房地產(chǎn)市場(chǎng)特征、框架與周期演變
評(píng)論
0/150
提交評(píng)論