青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

VC++動態鏈接庫編程之DLL典型實例

動態鏈接庫DLL實現了庫的共享,體現了代碼重用的思想。我們可以把廣泛的、具有共性的、能夠多次被利用的函數和類定義在庫中。這樣,在再次使用這些函數和類的時候,就不再需要重新添加與這些函數和類相關的代碼。具有共性的問題大致有哪些呢?筆者歸納如下:

 ?。?)通用的算法

  圖像處理、視頻音頻解碼、壓縮與解壓縮、加密與解密通常采用某些特定的算法,這些算法較固定且在這類程序中往往經常被使用。

 ?。?)純資源DLL

  我們可以從DLL中獲取資源,對于一個支持多種語言的應用程序而言,我們可以判斷操作系統的語言,并自動為應用程序加載與OS對應的語言。這是多語言支持應用程序的一般做法。

 ?。?)通信控制DLL

  串口、網口的通信控制函數如果由DLL提供則可以使應用程序輕松不少。在工業控制、modem程序甚至socket通信中,經常使用通信控制DLL。

  本節將給出DLL的三個典型應用實例。

  7.1 算法DLL

  我們直接用讀者的一個提問作為例子。

  宋寶華先生,您好!

  我在dev.yesky.com上看到你連載的《VC++動態鏈接庫編程》,覺得非常好。我以前主要是用Delphi的,C/C++學過,對Win32和VCL比較熟悉,但是沒有接觸過VC++,對MFC很陌生。這段時間和一個同學合作做光學成像的計算機模擬,用到傅立葉變換,手里面有例程是VC++寫的。我們的界面是用Delphi開發,需要將其傅立葉變換功能提出做一個DLL供Delphi調用。苦于不懂MFC,試了很多方法,都不成功,最后只得采用折衷方案,簡單修改一下程序,傳一個參數進去,當作exe來調用,才沒有耽擱后續進程。

  ……

  謝謝!

        致

  禮!

         某某

  學習過較高級別數學(概率統計與隨機過程)、信號與線性系統及數字信號處理的讀者應該知道,傅立葉變換是一種在信號分析中常用的算法,用于時域和頻域的相互轉換。FFT變換算法通用而有共性,我們適宜把它集成在一個DLL中。

  隨后,這位讀者提供了這樣的一個函數:

/* 函數名稱:FFT()
* 參數:
* complex<double> * TD - 指向時域數組的指針
* complex<double> * FD - 指向頻域數組的指針
* r -2的冪數,即迭代次數
* 返回值: 無。
* 說明:該函數用來實現快速傅立葉變換
*/

void FFT(complex<double> * TD, complex<double> * FD, int r)
{
 LONG count; // 傅立葉變換點數
 int i,j,k; // 循環變量
 int bfsize,p; // 中間變量
 double angle; // 角度
 complex<double> *W,*X1,*X2,*X;
 count = 1 << r; //傅立葉變換點數

 // 分配運算所需存儲器

 W = new complex<double>[count / 2];
 X1 = new complex<double>[count];
 X2 = new complex<double>[count];

 // 計算加權系數

 for(i = 0; i < count / 2; i++)
 {
  angle = -i * PI * 2 / count;
  W[i] = complex<double> (cos(angle), sin(angle));
 }

 // 將時域點寫入X1

 memcpy(X1, TD, sizeof(complex<double>) * count);

 // 采用蝶形算法進行快速傅立葉變換

 for(k = 0; k < r; k++)
 {
  for(j = 0; j < 1 << k; j++)
  {
   bfsize = 1 << (r-k);
   for(i = 0; i < bfsize / 2; i++)
   {
    p = j * bfsize;
    X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
    X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1<<k)];
   }
  }
  X = X1;
  X1 = X2;
  X2 = X;
 }

 // 重新排序

 for(j = 0; j < count; j++)
 {
  p = 0;
  for(i = 0; i < r; i++)
  {
   if (j&(1<<i))
   {
    p+=1<<(r-i-1);
   }
  }
  FD[j]=X1[p];
 }

 // 釋放內存

 delete W;
 delete X1;
 delete X2;
}

  既然有了FFT這個函數,我們要把它做在DLL中,作為DLL的一個接口將是十分簡單的,其步驟如下:

  (1)利用MFC向導建立一個非MFC DLL;

 ?。?)在工程中添加fft.h和fft.cpp兩個文件;

  fft.h的源代碼為:

#ifndef FFT_H
#define FFT_H

#include <complex>

using namespace std;
extern "C" void __declspec(dllexport) __stdcall FFT(complex<double> * TD, complex<double> * FD, int r);

#define PI 3.1415926
#endif

fft.cpp的源代碼為:

/* 文件名:fft.cpp */

#include "fft.h"
void __stdcall FFT(complex<double> * TD, complex<double> * FD, int r)
{
 …//讀者提供的函數代碼
}

  在任何編程語言中使用Win32 API LoadLibrary都可以加載這個DLL,而使用GetProcAddress(hDll, "FFT")則可以獲得函數FFT的地址,讀者所提到的Delphi當然也不例外。

  這個DLL中有兩點需要注意:

 ?。?)使用extern "C"修飾函數聲明,否則,生成的DLL只能供C++調用;

 ?。?)使用__stdcall修飾函數聲明及定義,__stdcall是Windows API的函數調用方式。
7.2純資源DLL

  我們在應用程序中產生如圖18所示的資源(對話框),單擊此處下載本工程。


圖18 中文對話框

  在與這個應用程序相同的工作區里利用MFC向導建立兩個簡單的DLL,把應用工程中的資源全選后分別拷貝到ChineseDll和EngLishDll,在EnglishDll工程的資源文件中搜索下面的語句:

/////////////////////////////////////////////////////////////////////////////

// Chinese (P.R.C.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

  將其改為:

/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

#pragma code_page(1252)
#endif //_WIN32

  并將其中所有的中文翻譯為英文。這個DLL為我們提供了如圖19所示的對話框資源。


圖19英文對話框

  修改應用工程的InitInstance()函數,在

CResourceDllCallDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();

  之前(即對話框顯示之前)添加如下代碼:

//獲取操作系統的語言

WORD wLangPID = PRIMARYLANGID( GetSystemDefaultLangID() );
if( LANG_CHINESE == wLangPID )
{
 hLanguageDll = LoadLibrary( "ChineseDll.dll" ); //加載中文資源
}
else
{
 hLanguageDll = LoadLibrary( "EnglishDll.dll" ); //加載英文資源
}

if( NULL == hLanguageDll )
{
 AfxMessageBox( "Load DLL failure" );
 return FALSE;
}
AfxSetResourceHandle( hLanguageDll ); //設置當前的資源句柄

  這樣的應用程序將具有自適應性質,在中文OS中顯示中文資源,在英文OS中則顯示英文資源。
7.3通信控制DLL

  我們在這里舉一個串口通信類的例子。

  也許您需要了解一點串口通信的背景知識,其實串口到處都看得到,譬如PC機的COM口即為串行通訊口(簡稱串口)。如圖20,打開Windows的設備管理器,我們看到了COM口。

  在Windows系統,需通過DCB(Device Control Block)對串口進行配置。利用Windows API GetCommState函數可以獲取串口當前配置;利用SetCommState函數則可以設置串口通訊的參數。

  串行通信通常按以下四步進行:

  (1)打開串口;

  (2)配置串口;

  (3)數據傳送;

  (4)關閉串口。


圖20 PC的串口

  由此可見,我們需要給串口控制DLL提供如下四個接口函數:

//打開指定的串口,其參數port為端口號

BOOL ComOpen(int port); //在這個函數里使用默認的參數設置串口

//將打開的串口關閉

void ComClose(int port);

//將串口接收緩沖區中的數據放到buffer中

int GetComData(char *buf, int buf_len);

//將指定長度的數據發送到串口

int SendDataToCom(LPBYTE buf,int buf_Len);

  下面給出了DLL接口的主要源代碼框架:

//com.h:com類通信接口

class AFX_EXT_CLASS com
{
 public:
  ComOpen(int port)
  {
   …
  }
  int SendDataToCom(LPBYTE buf,int buf_Len)
  {
   …
  }
  int GetComData(char *buf, int buf_len)
  {
   …
  }
  void ComClose()
  {
   …
  }
 }

  我們編寫一控制臺程序來演示DLL的調用:

#include <iostream>
#include <exception>

using namespace std;

#include <windows.h>
#include "com.h" //包含DLL中導出類的頭文件 int main(int argc, char *argv[])
{
 try
 {
  char str[] = "com_class test";
  com com1;
  com1.ComOpen (1);
  for(int i=0; i<100; i++) //以同步方式寫com的buffer
  {
   Sleep(500);
   com1.SendDataToCom (str,strlen(str));
  }
  com1.ComClose ();
 }
 catch(exception &e)
 {
  cout << e.what() << endl;
 }
 return 0;
}

  DLL的編寫與調用方法及主要應用皆已講完,在下一節里,我們將看到比較“高深”的主題――DLL木馬。曾幾何時,DLL木馬成為了病毒的一種十分重要的形式,是DLL的什么特性使得它能夠成為一種病毒?下一節我們將揭曉謎底。

posted on 2009-06-09 21:20 wrh 閱讀(316) 評論(0)  編輯 收藏 引用

導航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

統計

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            裸体一区二区| 欧美色偷偷大香| 蜜臀91精品一区二区三区| 中文网丁香综合网| 午夜精品偷拍| 亚洲综合色激情五月| 日韩香蕉视频| 亚洲欧美日韩中文播放| 99re热精品| 欧美日韩中国免费专区在线看| 欧美尤物一区| 亚洲一区在线看| 欧美亚洲在线观看| 久久国产精品99国产精| 欧美一级淫片播放口| 欧美伊人久久久久久午夜久久久久| 亚洲欧美日韩视频一区| 亚洲欧美激情四射在线日| 中文欧美字幕免费| 欧美一站二站| 久久婷婷一区| 欧美a级在线| 亚洲日本欧美| 日韩午夜在线观看视频| 亚洲国产高清一区二区三区| 久久久久久综合网天天| 亚洲一区在线看| 久久精品国产一区二区电影| 老鸭窝亚洲一区二区三区| 欧美高清视频| 99成人在线| 亚洲欧美日韩一区二区在线 | 国产精品自在欧美一区| 国产日产欧美精品| 国语自产精品视频在线看抢先版结局| 禁断一区二区三区在线 | 国产精品日韩在线观看| 国产亚洲成av人在线观看导航 | 国产精品久久毛片a| 国产亚洲综合性久久久影院| 黑丝一区二区| av成人免费在线| 亚洲一区精品在线| 久久激情五月激情| 欧美激情网友自拍| 正在播放亚洲一区| 久久青草久久| 国产精品日日摸夜夜摸av| 最新日韩av| 久久国产精品一区二区三区四区| 欧美国产精品一区| 西瓜成人精品人成网站| 欧美精品三级在线观看| 激情av一区| 亚洲欧美日韩精品久久亚洲区| 欧美成人有码| 午夜在线成人av| 欧美日韩另类在线| 亚洲国产网站| 一区二区三区欧美成人| 欧美一进一出视频| 国产精品蜜臀在线观看| 好吊色欧美一区二区三区四区| 一区二区欧美激情| 免费观看30秒视频久久| 亚洲欧美大片| 欧美性大战久久久久久久| 国产色综合天天综合网| 亚洲视频在线观看三级| 欧美黑人国产人伦爽爽爽| 亚洲欧美一区在线| 欧美大色视频| 在线欧美三区| 麻豆精品视频在线| 欧美一区二区三区免费视| 欧美视频一区二区三区| 一本久道久久久| 免费成人av在线| 久久天堂av综合合色| 国产一区二区三区电影在线观看| 欧美一级理论片| 99国产一区| 欧美性猛交一区二区三区精品| 一本久久知道综合久久| 亚洲国产成人一区| 嫩草成人www欧美| 亚洲福利视频免费观看| 久久影视三级福利片| 欧美专区在线播放| 激情欧美日韩一区| 欧美一区视频在线| 久久精品国产第一区二区三区最新章节| 国产欧亚日韩视频| 久久国产精品久久久久久电车| 欧美一区二区视频在线观看2020| 国产一区二区欧美| 亚洲第一精品夜夜躁人人躁| 欧美日韩第一区| 欧美一区二区观看视频| 亚洲少妇最新在线视频| 国产精品久久久久一区| 性做久久久久久免费观看欧美| 欧美影院在线| 99国产精品视频免费观看一公开| 一区二区高清视频| 国产在线国偷精品产拍免费yy| 午夜国产欧美理论在线播放| 久久成人精品电影| 一本色道久久综合狠狠躁篇的优点| 亚洲免费观看视频| 国产精品一区二区女厕厕| 久久野战av| 欧美一级片在线播放| 亚洲大片在线| 国产精品99久久久久久白浆小说| 国产亚洲欧美日韩美女| 欧美1区视频| 欧美日韩视频第一区| 中文亚洲免费| 麻豆精品精华液| 亚洲第一色在线| 午夜在线观看欧美| 亚洲欧美国产精品va在线观看| 美女精品国产| 中文一区在线| 久久久久久国产精品一区| 激情久久一区| 亚洲国产欧美另类丝袜| 日韩一区二区免费看| 最新成人av网站| 久久精品国产99国产精品澳门| 欧美激情一区在线观看| 欧美成人黑人xx视频免费观看| 国产一区二区三区免费不卡| 亚洲性夜色噜噜噜7777| 99精品国产一区二区青青牛奶 | 久久久久久久久一区二区| 欧美中文字幕在线播放| 国产精品久久婷婷六月丁香| 一本久道久久综合狠狠爱| 99视频在线观看一区三区| 亚洲午夜电影网| 国产精品99久久不卡二区 | 影音欧美亚洲| 久久久久高清| 欧美成人午夜剧场免费观看| 精品成人一区二区三区四区| 久久高清国产| 欧美国产高潮xxxx1819| 亚洲美女尤物影院| 欧美色图五月天| 欧美一级专区免费大片| 母乳一区在线观看| 日韩视频一区二区三区在线播放 | 欧美高清视频一区| 亚洲精品日韩在线| 亚洲欧美日韩专区| 国产精品自在线| 久久夜色精品国产欧美乱极品| 欧美激情网站在线观看| 亚洲性色视频| 国产亚洲一区二区在线观看 | 日韩小视频在线观看专区| 一区二区精品| 国产精品一区二区三区四区五区| 欧美一区二区私人影院日本| 亚洲电影中文字幕| 亚洲欧美国产日韩中文字幕| 好吊日精品视频| 欧美日韩国产综合网 | 久久乐国产精品| 欧美日韩不卡视频| 午夜精品一区二区三区在线播放| 午夜一区二区三视频在线观看 | 99国产精品私拍| 亚洲欧美日韩另类精品一区二区三区| 国产色视频一区| 亚洲高清三级视频| 国产麻豆精品久久一二三| 欧美大尺度在线观看| 欧美大片在线看| 久久蜜桃香蕉精品一区二区三区| 欧美a级理论片| 久久综合免费视频影院| 欧美日韩三级视频| 国内精品久久久久久| 久久久精品一区二区三区| 久久中文字幕导航| 国产女精品视频网站免费| 麻豆国产精品va在线观看不卡| 亚洲免费av网站| 欧美成人免费一级人片100| 亚洲欧美另类综合偷拍| 91久久精品日日躁夜夜躁国产| 国产精品亚洲综合色区韩国| 欧美黄色aaaa| 久久久久久久久久久久久女国产乱| 日韩视频精品在线观看| 欧美丰满高潮xxxx喷水动漫| 欧美一区激情|