4-16筆試

來源:互聯網
上載者:User

一、

char str[] = "abcd";cout<<sizeof(str)<<endl;//答案:5。因為有一個'\0'wchar_t wstr[] = "abcd";cout<<sizeof(wstr)<<endl;//答案:10。因為在wchar_t中,'\0'也是兩個位元組。在linux的g++編譯環境中不能使用wchar_t,原因未知char *p = "abcd";cout<<sizeof(p)<<endl;//答案:4。因為p是指標void *a = (char *)malloc(100);cout<<sizeof(a)<<endl;//答案:4。因為a是指標

二、

#define MAX 3+2cout<<MAX*MAX<<endl;//答案:11。3+2*3+2=11

三、在C++中調用C編譯器編譯過的函數時,為什麼要使用"extern C"?

答:

extern是C/C++語言中表明函數和全域變數作用範圍(可見度)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變數可以在本模組或其它模組中使用。通常,在模組的標頭檔中對本模組提供給其它模組引用的函數和全域變數以關鍵字include聲明。例如,如果模組B欲引用該模組A中定義的全域變數和函數時只需包含模組A的標頭檔即可。這樣,模組B中調用模組A中的函數時,在編譯階段,模組B雖然找不到該函數,但是並不會報錯;它會在串連階段中從模組A編譯產生的目標代碼中找到此函數。作為一種物件導向的語言,C++支援函數重載,而過程式語言C則不支援。函數被C++編譯後在符號庫中的名字與C語言的不同。例如,假設某個函數的原型為: void foo( int x, int y );該函數被C編譯器編譯後在符號庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不同的編譯器可能產生的名字不同,但是都採用了相同的機制,產生的新名字稱為“mangled name”)。_foo_int_int這樣的名字包含了函數名、函數參數數量及類型資訊,C++就是靠這種機制來實現函數重載的。例如,在C++中,函數void foo( int x, int y )與void foo( int x, float y )編譯產生的符號是不相同的,後者為_foo_int_float。同樣地,C++中的變數除支援局部變數外,還支援類成員變數和全域變數。使用者所編寫程式的類成員變數可能與全域變數同名,我們以"."來區分。而本質上,編譯器在進行編譯時間,與函數的處理相似,也為類中的變數取了一個獨一無二的名字,這個名字與使用者程式中同名的全域變數名字不同。extern "C"是串連申明(linkage declaration),被extern "C"修飾的變數和函數是按照C語言方式編譯和串連的。(1)未加extern "C"聲明時的串連方式假設在C++中,模組A的標頭檔如下:// 模組A標頭檔 moduleA.hint foo( int x, int y );在模組B中引用該函數:// 模組B實現檔案 moduleB.cpp#include "moduleA.h"foo(2,3); 在串連階段,連接器會從模組A產生的目標檔案moduleA.obj中尋找_foo_int_int這樣的符號!(2)加extern "C"聲明後的編譯和串連方式加extern "C"聲明後,模組A的標頭檔變為:// 模組A標頭檔 moduleA.hextern "C" int foo( int x, int y );在模組B的實現檔案中仍然調用foo( 2,3 ),其結果是:(1)模組A編譯產生foo的目標代碼時,沒有對其名字進行特殊處理,採用了C語言的方式;(2)連接器在為模組B的目標代碼尋找foo(2,3)調用時,尋找的是未經修改的符號名_foo。如果在模組A中函式宣告了foo為extern "C"類型,而模組B中包含的是extern int foo( int x, int y ) ,則模組B找不到模組A中的函數;反之亦然。所以,可以用一句話概括extern “C”這個聲明的真實目的:實現C++與C及其它語言的混合編程。  extern "C"通常的提示和慣用法:(1)在C++中引用C語言中的函數和變數,在包含C語言標頭檔(假設為cExample.h)時,需進行下列處理:extern "C"{#include "cExample.h"}而在C語言的標頭檔中,對其外部函數只能指定為extern類型,C語言中不支援extern "C"聲明,在.c檔案中包含了extern "C"時會出現編譯語法錯誤。如果C++調用一個C語言編寫的.DLL時,當包括.DLL的標頭檔或聲明介面函數時,應加extern "C" { }。(2)在C中引用C++語言中的函數和變數時,C++的標頭檔需添加extern "C",但是在C語言中不能直接引用聲明了extern "C"的該標頭檔,應該僅將C檔案中將C++中定義的extern "C"函式宣告為extern類型。

四、堆和棧有什麼區別?全域變數、靜態變數和常量分別存放在哪裡?char *p = "abc";,"abc"存放在哪裡?

記錄,待總結2

"abc"存放在文字常量區

五、SendMessage()和PostMessage()有什麼區別?GetMessage()和PeekMessage()有什麼區別?

http://blog.csdn.net/xt_xiaotian?viewmode=contents

1、SendMessage、PostMessage的運行機制SendMessage可以理解為,SendMessage函數發送訊息,等待訊息處理完成後,SendMessage才返回。稍微深入一點,是等待視窗處理函數返回後,SendMessage就返回了。PostMessage可以理解為,PostMessage函數發送訊息,不等待訊息處理完成,立刻返回。稍微深入一點,PostMessage只管發送訊息,訊息有沒有被送到則並不關心,只要發送了訊息,便立刻返回。對於寫一般Windows程式的程式員來說,能夠這樣理解也就足夠了。2、SendMessage、PostMessage的運行內幕在MSDN中,SendMessage解釋如為:The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.翻譯成中文為:SendMessage函數將指定的訊息發到視窗。它調用特定視窗的視窗處理函數,並且不會立即返回,直到視窗處理函數處理了這個訊息。再看看PostMessage的解釋:The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.    翻譯成中文為:PostMessage函數將一個訊息放入與建立這個視窗的訊息佇列相關的線程中,並立刻返回不等待線程處理訊息。仔細看完MSDN解釋,我們瞭解到,SendMessage的確是發送訊息,然後等待處理完成返回,但發送訊息的方法為直接調用訊息處理函數(即WndProc函數),按照函數調用規則,肯定會等訊息處理函數返回之後,SendMessage才返回。而PostMessage卻沒有發送訊息,PostMessage是將訊息放入訊息佇列中,然後立刻返回,至於訊息何時被處理,PostMessage完全不知道,此時只有訊息迴圈知道被PostMessage的訊息何時被處理了。

GetMessage(LPMSG lpMsg, HWND hWnd,   UINT wMsgFilterMin,   UINT wMsgFilterMax)PeekMessage(LPMSG lpMsg, HWND hWnd,   UINT wMsgFilterMin,   UINT wMsgFilterMax,UINT wRemoveMsg)參數wRemoveMsg的作用是指定訊息擷取的方式,如果設為PM_NOREMOVE,那麼訊息將不會從訊息佇列中被移出,如果設為PM_REMOVE,那麼訊息將會從訊息佇列中被移出;    兩個函數主要有以下兩個區別:     1.GetMessage將等到有合適的訊息時才返回,而PeekMessage只是撇一下訊息佇列。     2.GetMessage會將訊息從隊列中刪除,而PeekMessage可以設定最後一個參數wRemoveMsg來決定是否將訊息保留在隊列中。    在Windows的內部,GetMessage和PeekMessage執行著相同的代碼。而兩者最大的不同之處則體現在沒有任何訊息返回到應用程式的情況下。在此種情況下,PeekMessage會返回一個空值到應用程式,GetMessage會在此時讓應用程式休眠。

六、舉例說明Windows中有哪些同步對象(或鎖),在什麼情況下使用這些同步對象?

http://www.cppblog.com/sherrylso/archive/2007/07/22/28585.html

       在windows平台下,用於對多線程(包括進程)之間的同步保護機制,基本上有這麼幾種:1)Critical Section對象(臨界區) 2)Event對象(事件) 3)Mutex對象(互斥量) 4) Semaphore對象(訊號量)。本文的著眼點在於:總結出這些同步保護機制的一些明顯的行為特徵。       以下我們所討論的這些行為特徵,是對並發的進/線程之間的同步保護機制的一般描述,本文用windows平台作為一個典型的例子。 基於這一些行為特徵,對本文提及的這四種同步對象做一個分類。另外,在這裡,我們把這四種同步對象,統統稱為“鎖”,以便於接下來的討論。第一、保護與同步。        在這裡要強調的是:保護與同步是兩個不同的概念。而我們經常會混合這兩個概念。保護是指在多線程的環境下對共用資源的保護。這樣的共用資源大多數情況下是一段記憶體塊,它會被很多線程試圖訪問和修改。而同步更多的強調的是線程之間的協作,協同工作是需要同步支援的。基於這一性質,我們可以看出:Critical Section對象其本質更多的強調的是保護,而Event對象、Mutex對象與Semaphore對象更多的強調的是同步。不過,這樣的區別,只是概念上的區別,其本身不會對程式本身產生影響。第二、鎖的等待逾時       在開發並發的多進/線程程式時,為了避免死結之類的問題,引入了“等逾時“的概念,即當一個線程需要獲得一個鎖來執行某些代碼的時候,它可以在所等待的鎖上設定逾時值。如果在確定的時間(逾時值)內無法獲得該鎖,它可以選擇放棄執行該段代碼的權利,這樣可以在一定程度上避免出現死結的問題。這就是鎖的等待逾時的基本含義。基於這一行為特徵,我們來對上面四種同步對象做一個劃分:Critical Section對象是無法設定等待逾時的,而其他三個對象則可以設定等待逾時。從這一點來講,在使用Critical Section對象時,由於在等待進入關鍵程式碼片段時無法設定等待逾時,很容易造成死結。第三、線程鎖與進程鎖        這裡所說的線程鎖指的是該鎖只在一個進程的所有線程中可見,而進程鎖指的是該鎖可以被不同的進程所訪問,可用於進程間的同步與互斥。當然進程鎖仍然可以被用於同一個進程的不同線程之間的同步與互斥。進程鎖的概念是大於線程鎖的。基於這一特點劃分的話,Critical Section對象是線程鎖,而其他三個對象是進程鎖。這一點從本質上來分析,Critical Section對象是使用者態模式下面實現線程同步的方法,而其他三個對象均是核心對象。核心對象機制的適應性遠遠優於使用者方式機制。實際上,核心對象機制的唯一不足之處在於它的速度比較慢,這是因為當調用核心機制對象時,必須從使用者方式轉到核心方式。這樣的轉換需要付出很大的代價,是一件很費時的操作。在X86平台上,這樣往返一次需要佔用1000個CPU周期(這並不包括執行核心方式的代碼)。當然需要注意的是:使用Critical Section對象並不意味著線程不會陷入核心態執行。當一個線程試圖進入另一個線程擁有的關鍵程式碼片段時,該線程就會進入等待狀態。這意味著:該線程必須從使用者態轉為核心態。(為了提高這一方面的效能,Microsoft將迴圈鎖的概念納入到了Critical Section對象中,該線程可以有選擇地不進入核心態等待.具體請參閱MSDN)第四、鎖的遞迴特質        所謂遞迴鎖指的是當一個線程擁有一個同步鎖時,而遞迴地想再次取得該鎖.如果這次獲得操作不會阻塞當前線程的執行,則稱該鎖為遞迴鎖.遞迴鎖主要是在"保護"的概念上提出的,而"保護"概念下的鎖包括Critical Section對象和Mutext 對象.這兩種鎖在Windows平台上都是遞迴鎖。需要注意的是:調用線程獲得幾次遞迴鎖必須釋放幾次遞迴鎖。第五、讀寫鎖       讀寫鎖允許高效的並發的訪問多線程環境下的共用資源。對於一種共用資源,多個線程可以獲得讀鎖,共用地讀該共用資源。而在同一時刻,只允許一個線程擁有寫鎖改變該共用資源.這就是讀寫鎖的概念。很遺憾的是在Windows平台上沒有這樣的讀寫鎖,你需要自己去實現。

  支援等逾時 進程鎖 遞迴鎖 讀寫鎖
Critical Section對象 N/A
Event對象 N/A N/A
Mutex對象 N/A
Semaphore對象 N/A N/A

七、Windows中進程和線程是什麼關係?線程中能建立視窗嗎?

http://www.blogjava.net/chalmers/archive/2011/03/31/347358.html

    進程是系統分配資源的單位,每一個進程對應與一個活動的程式,當進程啟用時,作業系統就將系統的資源套件括記憶體、I/O和CPU等分配給它,使它執行。線程是CPU分配時間的單位,每一個線程對應於它在進程中的一個函數,也就是記憶體中的程式碼片段,多個線程執行時CPU會根據它們的優先順序分配時間,使它們完成自己的功能。 一般來說,進程中至少一個線程,一個主線程和其他線程組成一個進程。多個線程的目的在於分享CPU的時間片,從而完成並行任務。    1.調度線程師調度和指派的基本單位,進程是資源擁有的基本單位。    2.並發性進程之間可以並發執行,在一個進程中的多個線程之間也可以並發執行。    3.擁有資源進程是擁有資源的一個獨立單元,線程自己不擁有系統資源(也有一點比不可少的資源)但它可以訪問其隸屬進程的資源。    4.系統開銷建立或撤消進程時,系統都要為之分配或回收資源,如記憶體空間、I/O裝置等,OS所付出的開銷顯著大於在建立或撤消線程時的開銷;進程切換的開銷也遠大於線程切換的開銷。  實際上線程運行而進程不運行。兩個進程彼此獲得專用資料或記憶體的唯一途徑就是通過協議來共用記憶體塊。這是一種協作策略。上述解釋便是原因所在。上述也就是我們在工作管理員的進程選項卡中所能看到的基本資料列。
線程中可以建立視窗

八、處理序間通訊的方式有哪些?

http://blog.csdn.net/shiqz/article/details/5862936

1 檔案對應  檔案對應(Memory-Mapped Files)能使進程把檔案內容當作進程地址區間一塊記憶體那樣來對待。因此,進程不必使用檔案I/O操作,只需簡單的指標操作就可讀取和修改檔案的內容。  Win32 API允許多個進程訪問同一檔案對應物件,各個進程在它自己的地址空間裡接收記憶體的指標。通過使用這些指標,不同進程就可以讀或修改檔案的內容,實現了對檔案中資料的共用。  應用程式有三種方法來使多個進程共用一個檔案對應物件。  (1)繼承:第一個進程建立檔案對應物件,它的子進程繼承該對象的控制代碼。  (2)命名檔案對應:第一個進程在建立檔案對應物件時可以給該對象指定一個名字(可與檔案名稱不同)。第二個進程可通過這個名字開啟此檔案對應物件。另外,第一個進程也可以通過一些其它IPC機制(有名管道、郵件槽等)把名字傳給第二個進程。  (3)控制代碼複製:第一個進程建立檔案對應物件,然後通過其它IPC機制(有名管道、郵件槽等)把物件控點傳遞給第二個進程。第二個進程複製該控制代碼就取得對該檔案對應物件的存取權限。  檔案對應是在多個進程間共用資料的非常有效方法,有較好的安全性。但檔案對應只能用於本地機器的進程之間,不能用於網路中,而開發人員還必須控制進程間的同步。2 共用記憶體  Win32 API中共用記憶體(Shared Memory)實際就是檔案對應的一種特殊情況。進程在建立檔案對應物件時用0xFFFFFFFF來代替檔案控制代碼(HANDLE),就表示了對應的檔案對應物件是從作業系統分頁檔訪問記憶體,其它進程開啟該檔案對應物件就可以訪問該記憶體塊。由於共用記憶體是用檔案對應實現的,所以它也有較好的安全性,也只能運行於同一電腦上的進程之間。3 匿名管道  管道(Pipe)是一種具有兩個端點的通訊通道:有一端控制代碼的進程可以和有另一端控制代碼的進程通訊。管道可以是單向-一端是唯讀,另一端點是唯寫的;也可以是雙向的一管道的兩端點既可讀也可寫。  匿名管道(Anonymous Pipe)是 在父進程和子進程之間,或同一父進程的兩個子進程之間傳輸資料的無名字的單向管道。通常由父進程建立管道,然後由要通訊的子進程繼承通道的讀端點控制代碼或寫 端點控制代碼,然後實現通訊。父進程還可以建立兩個或更多個繼承匿名管道讀和寫控制代碼的子進程。這些子進程可以使用管道直接通訊,不需要通過父進程。  匿名管道是單機上實現子進程標準I/O重新導向的有效方法,它不能在網上使用,也不能用於兩個不相關的進程之間。4 具名管道  具名管道(Named Pipe)是伺服器處理序和一個或多個客戶進程之間通訊的單向或雙向管道。不同於匿名管道的是具名管道可以在不相關的進程之間和不同電腦之間使用,伺服器建立具名管道時給它指定一個名字,任何進程都可以通過該名字開啟管道的另一端,根據給定的許可權和伺服器處理序通訊。  具名管道提供了相對簡單的編程介面,使通過網路傳輸資料並不比同一電腦上兩進程之間通訊更困難,不過如果要同時和多個進程通訊它就力不從心了。5 郵件槽  郵件槽(Mailslots)提 供進程間單向通訊能力,任何進程都能建立郵件槽成為郵件槽伺服器。其它進程,稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽伺服器處理序發送訊息。進來的消 息一直放在郵件槽中,直到伺服器處理序讀取它為止。一個進程既可以是郵件槽伺服器也可以是郵件槽客戶,因此可建立多個郵件槽實現進程間的雙向通訊。  通過郵件槽可以給本機電腦上的郵件槽、其它電腦上的郵件槽或指定網路地區中所有電腦上有同樣名字的郵件槽發送訊息。廣播通訊的訊息長度不能超過400位元組,非廣播訊息的長度則受郵件槽伺服器指定的最大訊息長度的限制。  郵件槽與具名管道相似,不過它傳輸資料是通過不可靠的資料報(如TCP/IP協議中的UDP包)完成的,一旦網路發生錯誤則無法保證訊息正確地接收,而具名管道傳輸資料則是建立在可靠串連基礎上的。不過郵件槽有簡化的編程介面和給指定網路地區內的所有電腦廣播訊息的能力,所以郵件槽不失為應用程式發送和接收訊息的另一種選擇。6 剪貼簿  剪貼簿(Clipped Board)實質是Win32 API中一組用來傳輸資料的函數和訊息,為Windows應用程式之間進行資料共用提供了一個中介,Windows已建立的剪下(複製)-粘貼的機製為不同應用程式之間共用不同格式資料提供了一條捷徑。當使用者在應用程式中執行剪下或複製操作時,應用程式把選取的資料用一種或多種格式放在剪貼簿上。然後任何其它應用程式都可以從剪貼簿上拾取資料,從給定格式中選擇適合自己的格式。  剪貼簿是一個非常鬆散的交換媒介,可以支援任何資料格式,每一格式由一不帶正負號的整數標識,對標準(預定義)剪貼簿格式,該值是Win32 API定義的常量;對非標準格式可以使用Register Clipboard Format函數註冊為新的剪貼簿格式。利用剪貼簿進行交換的資料只需在資料格式上一致或都可以轉化為某種格式就行。但剪貼簿只能在基於Windows的程式中使用,不能在網路上使用。7 動態資料交換  動態資料交換(DDE)是使用共用記憶體在應用程式之間進行資料交換的一種處理序間通訊形式。應用程式可以使用DDE進行一次性資料轉送,也可以當出現新資料時,通過發送更新值在應用程式間動態交換資料。  DDE和剪貼簿一樣既支援標準資料格式(如文本、位元影像等),又可以支援自己定義的資料格式。但它們的資料轉送機制卻不同,一個明顯區別是剪貼簿操作幾乎總是用作對使用者指定操作的一次性應答-如從菜單中選擇Paste命令。儘管DDE也可以由使用者啟動,但它繼續發揮作用一般不必使用者進一步幹預。DDE有三種資料交換方式:  (1) 冷鏈:資料交換是一次性資料轉送,與剪貼簿相同。  (2) 溫鏈:當資料交換時伺服器通知客戶,然後客戶必須請求新的資料。  (3) 熱鏈:當資料交換時伺服器自動給客戶發送資料。  DDE交換可以發生在單機或網路中不同電腦的應用程式之間。開發人員還可以定義定製的DDE資料格式進行應用程式之間特別目的IPC,它們有更緊密耦合的通訊要求。大多數基於Windows的應用程式都支援DDE。8 對象串連與嵌入  應用程式利用對象串連與嵌入(OLE)技術管理複合文檔(由多種資料格式組成的文檔),OLE提供使某應用程式更容易調用其它應用程式進行資料編輯的服務。例如,OLE支援的文書處理器可以嵌套試算表,當使用者要編輯試算表時OLE庫可自動啟動試算表編輯器。當使用者退出試算表編輯器時,該表格已在原始文書處理器文檔中得到更新。在這裡試算表編輯器變成了文書處理器的擴充,而如果使用DDE,使用者要顯式地啟動試算表編輯器。  同DDE技術相同,大多數基於Windows的應用程式都支援OLE技術。9 動態串連庫  Win32動態串連庫(DLL)中的全域資料可以被調用DLL的所有進程共用,這就又給處理序間通訊開闢了一條新的途徑,當然訪問時要注意同步問題。  雖然可以通過DLL進行進程間資料共用,但從資料安全的角度考慮,我們並不提倡這種方法,使用帶有存取權限控制的共用記憶體的方法更好一些。10 遠端程序呼叫  Win32 API提供的遠端程序呼叫(RPC)使應用程式可以使用遠程調用函數,這使在網路上用RPC進行進程通訊就像函數調用那樣簡單。RPC既可以在單機不同進程間使用也可以在網路中使用。  由於Win32 API提供的RPC服從OSF-DCE(Open Software Foundation Distributed Computing Environment)標準。所以通過Win32 API編寫的RPC應用程式能與其它作業系統上支援DEC的RPC應用程式通訊。使用RPC開發人員可以建立高效能、緊密耦合的分布式應用程式。11 NetBios函數  Win32 API提供NetBios函數用於處理低級網路控制,這主要是為IBM NetBios系統編寫與Windows的介面。除非那些有特殊低級網路功能要求的應用程式,其它應用程式最好不要使用NetBios函數來進行處理序間通訊。12 Sockets  Windows Sockets規範是以U.C.Berkeley大學BSD UNIX中流行的Socket介面為範例定義的一套Windows下的網路編程介面。除了Berkeley Socket原有的庫函數以外,還擴充了一組針對Windows的函數,使程式員可以充分利用Windows的訊息機制進行編程。  現在通過Sockets實現進程通訊的網路應用越來越多,這主要的原因是Sockets的跨平台性要比其它IPC機制好得多,另外WinSock 2.0不僅支援TCP/IP協議,而且還支援其它協議(如IPX)。Sockets的唯一缺點是它支援的是底層通訊操作,這使得在單機的進程間進行簡單資料傳遞不太方便,這時使用下面將介紹的WM_COPYDATA訊息將更合適些。13 WM_COPYDATA訊息  WM_COPYDATA是一種非常強大卻鮮為人知的訊息。當一個應用向另一個應用傳送資料時,發送方只需使用調用SendMessage函數,參數是目的視窗的控制代碼、傳遞資料的起始地址、WM_COPYDATA訊息。接收方只需像處理其它訊息那樣處理WM_COPY DATA訊息,這樣收發雙方就實現了資料共用。  WM_COPYDATA是一種非常簡單的方法,它在底層實際上是通過檔案對應來實現的。它的缺點是靈活性不高,並且它只能用於Windows平台的單機環境下。

在UNIX系統中,處理序間通訊的基本機制有:管道和具名管道、訊號量、訊息、共用記憶體區、通訊端

九、虛函數與普通函數有什麼區別?

1.聲明的時,虛函數要使用關鍵字virtual,定義時不用如:virtual int Func()2.虛函數能實現多態3.虛函數實現動態聯編,開銷大

十、如何顯式地載入動態連結程式庫

兩種方法對於你的程式調用動態庫時沒有任何區別,只是你在編程時,步驟是不一樣的。顯式調用麻煩了點,但可以沒有相應的lib庫;隱式調用,使用起來比較簡單,有函數的聲明就可以了,但必須有lib庫。在VC中兩種方式的具體方法:一、動態庫的隱示調用:在 VC 工程中直接連結靜態輸入庫XXX.lib,然後即可像調用其它源檔案中的函數一樣調用DLL中的函數了。二、動態庫的顯式調用:顯式調用動態庫步驟:1、建立一個函數指標,其指標資料類型要與調用的 DLL 引出函數相吻合。2、通過 Win32 API 函數LoadLibrary()顯式的調用DLL,此函數返回DLL 的執行個體控制代碼。3、通過 Win32 API 函數GetProcAddress()擷取要調用的DLL 的函數地址,把結果賦給自訂函數的指標類型。4、使用函數指標來調用 DLL 函數。5、最後調用完成後,通過 Win32 API 函數FreeLibrary()釋放DLL 函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.