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

VC++動(dòng)態(tài)鏈接庫(kù)編程之DLL典型實(shí)例

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

  (1)通用的算法

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

  (2)純資源DLL

  我們可以從DLL中獲取資源,對(duì)于一個(gè)支持多種語(yǔ)言的應(yīng)用程序而言,我們可以判斷操作系統(tǒng)的語(yǔ)言,并自動(dòng)為應(yīng)用程序加載與OS對(duì)應(yīng)的語(yǔ)言。這是多語(yǔ)言支持應(yīng)用程序的一般做法。

  (3)通信控制DLL

  串口、網(wǎng)口的通信控制函數(shù)如果由DLL提供則可以使應(yīng)用程序輕松不少。在工業(yè)控制、modem程序甚至socket通信中,經(jīng)常使用通信控制DLL。

  本節(jié)將給出DLL的三個(gè)典型應(yīng)用實(shí)例。

  7.1 算法DLL

  我們直接用讀者的一個(gè)提問(wèn)作為例子。

  宋寶華先生,您好!

  我在dev.yesky.com上看到你連載的《VC++動(dòng)態(tài)鏈接庫(kù)編程》,覺(jué)得非常好。我以前主要是用Delphi的,C/C++學(xué)過(guò),對(duì)Win32和VCL比較熟悉,但是沒(méi)有接觸過(guò)VC++,對(duì)MFC很陌生。這段時(shí)間和一個(gè)同學(xué)合作做光學(xué)成像的計(jì)算機(jī)模擬,用到傅立葉變換,手里面有例程是VC++寫(xiě)的。我們的界面是用Delphi開(kāi)發(fā),需要將其傅立葉變換功能提出做一個(gè)DLL供Delphi調(diào)用。苦于不懂MFC,試了很多方法,都不成功,最后只得采用折衷方案,簡(jiǎn)單修改一下程序,傳一個(gè)參數(shù)進(jìn)去,當(dāng)作exe來(lái)調(diào)用,才沒(méi)有耽擱后續(xù)進(jìn)程。

  ……

  謝謝!

        致

  禮!

         某某

  學(xué)習(xí)過(guò)較高級(jí)別數(shù)學(xué)(概率統(tǒng)計(jì)與隨機(jī)過(guò)程)、信號(hào)與線(xiàn)性系統(tǒng)及數(shù)字信號(hào)處理的讀者應(yīng)該知道,傅立葉變換是一種在信號(hào)分析中常用的算法,用于時(shí)域和頻域的相互轉(zhuǎn)換。FFT變換算法通用而有共性,我們適宜把它集成在一個(gè)DLL中。

  隨后,這位讀者提供了這樣的一個(gè)函數(shù):

/* 函數(shù)名稱(chēng):FFT()
* 參數(shù):
* complex<double> * TD - 指向時(shí)域數(shù)組的指針
* complex<double> * FD - 指向頻域數(shù)組的指針
* r -2的冪數(shù),即迭代次數(shù)
* 返回值: 無(wú)。
* 說(shuō)明:該函數(shù)用來(lái)實(shí)現(xiàn)快速傅立葉變換
*/

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

 // 分配運(yùn)算所需存儲(chǔ)器

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

 // 計(jì)算加權(quán)系數(shù)

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

 // 將時(shí)域點(diǎn)寫(xiě)入X1

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

 // 采用蝶形算法進(jìn)行快速傅立葉變換

 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];
 }

 // 釋放內(nèi)存

 delete W;
 delete X1;
 delete X2;
}

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

  (1)利用MFC向?qū)Ы⒁粋€(gè)非MFC DLL;

  (2)在工程中添加fft.h和fft.cpp兩個(gè)文件;

  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)
{
 …//讀者提供的函數(shù)代碼
}

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

  這個(gè)DLL中有兩點(diǎn)需要注意:

  (1)使用extern "C"修飾函數(shù)聲明,否則,生成的DLL只能供C++調(diào)用;

  (2)使用__stdcall修飾函數(shù)聲明及定義,__stdcall是Windows API的函數(shù)調(diào)用方式。
7.2純資源DLL

  我們?cè)趹?yīng)用程序中產(chǎn)生如圖18所示的資源(對(duì)話(huà)框),單擊此處下載本工程


圖18 中文對(duì)話(huà)框

  在與這個(gè)應(yīng)用程序相同的工作區(qū)里利用MFC向?qū)Ы蓚€(gè)簡(jiǎn)單的DLL,把應(yīng)用工程中的資源全選后分別拷貝到ChineseDll和EngLishDll,在EnglishDll工程的資源文件中搜索下面的語(yǔ)句:

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

// 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

  并將其中所有的中文翻譯為英文。這個(gè)DLL為我們提供了如圖19所示的對(duì)話(huà)框資源。


圖19英文對(duì)話(huà)框

  修改應(yīng)用工程的InitInstance()函數(shù),在

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

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

//獲取操作系統(tǒng)的語(yǔ)言

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 ); //設(shè)置當(dāng)前的資源句柄

  這樣的應(yīng)用程序?qū)⒕哂凶赃m應(yīng)性質(zhì),在中文OS中顯示中文資源,在英文OS中則顯示英文資源。
7.3通信控制DLL

  我們?cè)谶@里舉一個(gè)串口通信類(lèi)的例子。

  也許您需要了解一點(diǎn)串口通信的背景知識(shí),其實(shí)串口到處都看得到,譬如PC機(jī)的COM口即為串行通訊口(簡(jiǎn)稱(chēng)串口)。如圖20,打開(kāi)Windows的設(shè)備管理器,我們看到了COM口。

  在Windows系統(tǒng),需通過(guò)DCB(Device Control Block)對(duì)串口進(jìn)行配置。利用Windows API GetCommState函數(shù)可以獲取串口當(dāng)前配置;利用SetCommState函數(shù)則可以設(shè)置串口通訊的參數(shù)。

  串行通信通常按以下四步進(jìn)行:

  (1)打開(kāi)串口;

  (2)配置串口;

  (3)數(shù)據(jù)傳送;

  (4)關(guān)閉串口。


圖20 PC的串口

  由此可見(jiàn),我們需要給串口控制DLL提供如下四個(gè)接口函數(shù):

//打開(kāi)指定的串口,其參數(shù)port為端口號(hào)

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

//將打開(kāi)的串口關(guān)閉

void ComClose(int port);

//將串口接收緩沖區(qū)中的數(shù)據(jù)放到buffer中

int GetComData(char *buf, int buf_len);

//將指定長(zhǎng)度的數(shù)據(jù)發(fā)送到串口

int SendDataToCom(LPBYTE buf,int buf_Len);

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

//com.h:com類(lèi)通信接口

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()
  {
   …
  }
 }

  我們編寫(xiě)一控制臺(tái)程序來(lái)演示DLL的調(diào)用:

#include <iostream>
#include <exception>

using namespace std;

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

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

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


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


導(dǎo)航

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

統(tǒng)計(jì)

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲综合欧美日韩| 一本色道88久久加勒比精品 | 久久婷婷人人澡人人喊人人爽| 美腿丝袜亚洲色图| 国内在线观看一区二区三区| 亚洲自拍都市欧美小说| 亚洲人成网站在线观看播放| 久久国产福利| 国产一区二区在线观看免费| 欧美一级理论片| 亚洲网站在线| 国产精品红桃| 午夜国产精品影院在线观看 | 欧美高清免费| 亚洲国产精品久久精品怡红院| 狂野欧美性猛交xxxx巴西| 欧美一区午夜视频在线观看| 国产一区二区三区免费观看| 久久久久久亚洲精品中文字幕 | 亚洲激情av在线| 免费观看国产成人| 久热re这里精品视频在线6| 黄色欧美成人| 欧美国产另类| 欧美二区视频| 亚洲夜间福利| 亚洲欧美久久| 国产手机视频一区二区| 久久精品91久久久久久再现| 欧美专区日韩视频| 亚洲国产视频直播| 亚洲国产中文字幕在线观看| 欧美日韩国产一区二区三区地区| 亚洲一区999| 亚洲免费在线播放| 国产在线乱码一区二区三区| 免费久久99精品国产自在现线| 蜜桃久久精品乱码一区二区| 日韩视频在线免费| 亚洲一区二区三区三| 国模私拍视频一区| 亚洲激情综合| 国产欧美91| 欧美成人一区二区三区在线观看| 欧美理论在线| 久久精品一区蜜桃臀影院| 美女免费视频一区| 免费亚洲婷婷| 性一交一乱一区二区洋洋av| 久久久久久日产精品| 99国内精品| 欧美一区二区三区久久精品茉莉花| 亚洲国产精品久久久| 亚洲视频免费在线| 亚洲国产精品嫩草影院| 一区二区三区视频在线| 在线播放中文一区| 在线亚洲精品福利网址导航| 一色屋精品视频免费看| 一区二区三区四区五区视频| 在线日韩av片| 亚洲欧美精品在线| 日韩一区二区高清| 久久久激情视频| 亚洲欧美一区二区精品久久久| 久久亚洲精选| 性亚洲最疯狂xxxx高清| 欧美国产综合一区二区| 久久综合久久综合久久综合| 国产精品爽爽爽| 亚洲精品在线观看免费| 亚洲电影免费观看高清完整版在线 | 久久久久久一区二区| 亚洲欧美激情一区二区| 欧美成人精品高清在线播放| 久久久综合激的五月天| 国产精品日本精品| 亚洲美女视频网| 亚洲日本成人| 久久亚洲精品一区| 看片网站欧美日韩| 国产一区二区三区网站 | 欧美三级黄美女| 亚洲国产岛国毛片在线| 在线观看久久av| 欧美亚洲一级片| 欧美一区影院| 国产精品久久久久一区| 一区二区三区欧美在线观看| 中文一区字幕| 国产精品国产成人国产三级| 夜夜嗨一区二区| 亚洲嫩草精品久久| 国产精品久久久久久久久婷婷| 一区二区三区四区精品| 亚洲欧美国产日韩中文字幕| 国产精品久久久久国产精品日日| 亚洲视频免费在线| 欧美在线观看一区二区| 国产欧美日韩综合| 久久国产日本精品| 欧美成人中文字幕| 亚洲人成在线观看| 欧美精品v日韩精品v国产精品| 亚洲精品网站在线播放gif| 一区二区三区**美女毛片| 欧美日韩视频在线一区二区| 在线一区二区三区四区五区| 国产自产v一区二区三区c| 欧美一区日韩一区| 欧美肥婆bbw| 亚洲精品日产精品乱码不卡| 欧美精品一区在线播放| 亚洲最新中文字幕| 性色一区二区三区| 精品av久久久久电影| 美日韩精品免费观看视频| 一本到12不卡视频在线dvd| 亚洲激情国产精品| 亚洲电影免费观看高清完整版在线 | 欧美精品日韩| 免费观看一级特黄欧美大片| 国产精品色网| 日韩一级精品| 亚洲精品一区二区三区四区高清| 欧美在线亚洲在线| 亚洲综合国产精品| 欧美日韩不卡| 亚洲欧洲一二三| 亚洲欧洲一区二区在线播放| 久久久在线视频| 久久噜噜噜精品国产亚洲综合| 国产精品久久久久久久久| av成人手机在线| 亚洲一二三四久久| 欧美日韩免费一区二区三区视频| 亚洲二区视频在线| 亚洲激情在线视频| 欧美高清hd18日本| 亚洲精品久久在线| 亚洲视频一区二区| 国产精品久久久久999| 亚洲自啪免费| 欧美一区二区三区在线视频| 国产精品网站在线观看| 亚洲欧美久久| 久热爱精品视频线路一| 亚洲电影免费| 欧美久久久久久| 99热精品在线观看| 午夜一级久久| 激情久久久久| 欧美成人免费全部| 99国内精品| 欧美影院在线播放| 亚洲成在人线av| 欧美理论在线| 性18欧美另类| 欧美高清在线| 正在播放欧美视频| 国产精品一二三四区| 久久伊人精品天天| 99视频在线观看一区三区| 欧美一激情一区二区三区| 黄网动漫久久久| 欧美黄色一区二区| 亚洲一区二区三区激情| 六月婷婷一区| 一本色道久久综合亚洲精品不| 国产精品美女一区二区在线观看| 久久精品国亚洲| 亚洲另类自拍| 麻豆精品一区二区综合av| 日韩视频在线一区二区| 国产婷婷色一区二区三区| 最新69国产成人精品视频免费| 亚洲校园激情| 亚洲国产岛国毛片在线| 国产精品久久久久毛片大屁完整版| 久久精品国产91精品亚洲| 亚洲精品网址在线观看| 久久亚洲国产成人| 亚洲天堂黄色| 亚洲激情视频在线观看| 国产精品欧美精品| 欧美精品一级| 久久久久久午夜| 亚洲夜晚福利在线观看| 欧美激情导航| 久久综合久久久| 欧美亚洲一区在线| 宅男精品视频| 日韩网站免费观看| 在线欧美视频| 国产在线观看91精品一区| 国产精品午夜春色av| 欧美日韩国产在线看| 蜜桃久久av| 麻豆久久婷婷| 久久久亚洲人|