1.關於文章的獲取
許多讀者發來e-mail詢問本系列文章的相關事宜,如:
(1) 是否已出版?
(2) 哪裡可以下載打包版?
(3) 哪裡可以下載筆者的其它文章?
還有一些讀者對日前筆者在天極網發表的《C語言嵌入式系統編程修煉之道》非常喜愛,給予了熱情洋溢的贊揚,詢問筆者能否繼續創作嵌入式編程方面的文章。
對於這些問題,統一作答如下:
(1)本系列文章暫時尚未出版;
(2)您可以在天極網軟件頻道下載筆者的多數拙作。另外,我也將不定期將這些文章上傳到我的博客( http://blog.donews.com/21cnbao/)。所有文章中的例程源代碼均經過親手調試,驗證無誤;
(3)就嵌入式系統開發,筆者將繼續進行此方面的創作,新近將推出《基於嵌入式實時OS VxWorks的多任務程序設計》及《領悟:從Windows多線程到VxWorks的多任務》。
非常感謝讀者朋友對這些文章的喜愛,在下將竭盡所能地為您提供更多的好文章。
2.關於DLL的疑問
你好,看了你寫的"VC++ DLL編程深入淺出",特別有收獲。 只是有個地方我老搞不明白,就是用DLL導出全局變量時,指定了.lib的路徑(#pragma comment(lib,"dllTest.lib")),那麼.dll的文件的路徑呢,我嘗試著把.dll文件移到別的地方程序就無法正常運行了,請問.dll在這裡怎麼指定。
希望您能在百忙中抽空給我解答一下,不勝感激!
一位編程愛好者
回答:
Windows按下列順序搜索DLL:
(1)當前進程的可執行模塊所在的目錄;
(2)當前目錄;
(3)Windows 系統目錄,通過GetSystemDirectory 函數可獲得此目錄的路徑;
(4)Windows 目錄,通過GetWindowsDirectory 函數可獲得此目錄的路徑;
(5)PATH 環境變量中列出的目錄。
因此,隱式鏈接時,DLL文件的路徑不需要指定也不能指定,系統指定按照1~5的步驟尋找DLL,但是對應的.lib文件卻需要指定路徑;如果使用Windows API函數LoadLibrary動態加載DLL,則可以指定DLL的路徑。
你好,我是一位C++初學者,我在PCONLINE看了教學之後,受益不淺。我想問一下能否在DLL裡使用多線程?MSDN上用#using <mscorlib.dll>這個指令之後實現了多線程,不過好象不支持DLL..
請問有什麼辦法支持制作多線程DLL??能否給一個源碼來?
回答:
在DLL中可以處理多線程,WIN32對於多線程的支持是操作系統本身提供的一種能力,並不在於用戶編寫的是哪一類程序。即便是一個控制台程序,我們都可以使用多線程:
#include <stdio.h>
#include <Windows.h>
void ThreadFun(void)
{
while(1)
{
printf( "this is new thread " );
Sleep( 1000 );
}
}
int main()
{
DWord threadID;
CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFun, NULL, 0, &threadID );
while(1)
{
printf( "this is main thread " );
Sleep( 1000 );
}
}
觀察程序運行的結果為在控制台窗口上交替輸出this is main thread、this is new thread。
我們來看下面的一個多線程DLL的例子。
DLL程序提供一個接口函數SendInit,在此接口中啟動發送線程SendThreadFunc,在這個線程的對應工作函數中我們使用原始套接字socket發送報文。參考微軟出版的經典書籍《Windows核心編程》,我們發現,不宜在DLL被加載的時候(即進程綁定時)啟動一個新的線程。
這個線程等待一個CEvent事件(用於線程間通信),應用程序調用DLL中的接口函數SendMsg( InterDataPkt sendData )可以釋放此事件。下面是相關的源代碼:
(1)發送報文線程入口函數
///////////////////////////////////////////////////////////////////////////
//函數名:SendThreadFunc
//函數功能:發送報文工作線程入口函數,使用UDP協議
////////////////////////////////////////////////////////////////////////////
DWord WINAPI SendThreadFunc( LPVOID lpvThreadParm )
//提示:對於線程函數應使用WINAPI聲明,WINAPI被宏定義為__stdcall
{
/* 創建socket */
sendSock = socket ( AF_INET, SOCK_DGRAM, 0 );
if ( sendSock == INVALID_SOCKET )
{
AfxMessageBox ( "Socket創建失敗" );
closesocket ( recvSock );
}
/* 獲得目標節點端口與地址 */
struct sockaddr_in desAddr;
desAddr.sin_family=AF_INET;
desAddr.sin_port=htons( DES_RECV_PORT ); //目標節點接收端口
desAddr.sin_addr.s_addr = inet_addr( DES_IP );
/* 發送數據 */
while(1)
{
WaitForSingleObject( hSendEvent, 0xffffffffL );//無限等待事件發生
ResetE
[1] [2] [3] 下一頁