程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC++動態鏈接庫編程之讀者反饋與答復

VC++動態鏈接庫編程之讀者反饋與答復

編輯:vc教程

  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] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved