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

C++ Coder

HCP高性能計算架構,實現,編譯器指令優化,算法優化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首頁 新隨筆 聯系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://www.cnblogs.com/greatverve/archive/2010/11/19/vc-dll.html

1 用VC創建DLL動態鏈接庫
1.1 創建dll項目

1.2 為dll項目編寫源文件

頭文件dllDemo.h
extern "C" _declspec(dllexport) int Sum(int a,int b);//加法函數。
extern "C" _declspec(dllexport) int Max(int a, int b);//取較大值函數
extern "C" _declspec(dllexport) int Min(int a, int b);//取較小值函數
源文件dllDemo.cpp
復制代碼
大氣象
#include "dllDemo.h"
extern "C" _declspec(dllexport)int Sum(int a, int b)
{
return a+b;}
extern "C" _declspec(dllexport)int Max(int a, int b)
{
    
if(a>=b)
        
return a;
    
else
        
return b;
}
extern "C" _declspec(dllexport)int Min(int a, int b)
{
    
if(a>=b)
        
return b;
    
else
        
return a;
}
復制代碼

1.3 生成dll文件

編譯源文件,如果沒有出現錯誤提示,那么,在項目文件根目錄的Debug文件夾內會生成一個dll文件“dllDemo.dll”。

調用
新建了個MFC單對話框項目,
dllDemo.dll”和”dllDemo.lib”文件復制到本項目的Debug目錄下,
在VC工作空間的文件視圖下面將”dllDemo.lib”添加到項目中

在對話框頭文件添加引用:

復制代碼
大氣象
// FileOperDlg.h : 頭文件
//

#pragma once

extern "C"_declspec(dllimport) int Sum(int a,int b);
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
// CFileOperDlg 對話框
class CFileOperDlg : public CDialog
{
// 構造
public:
    CFileOperDlg(CWnd
* pParent = NULL);    // 標準構造函數

// 對話框數據
    enum { IDD = IDD_FILEOPER_DIALOG };

    
protected:
    
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 實現
protected:
    HICON m_hIcon;

    
// 生成的消息映射函數
    virtual BOOL OnInitDialog();
    afx_msg 
void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg 
void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    CString m_info;
};
復制代碼

 

調用:

CString str;
int c=Sum(4,5);  
//c=Max(5,6);  
//c=Min(5,6);
str.Format("%d",c);
AfxMessageBox(str);

 

調試
直接運行,選擇一個調用dll的exe確定之后,就可以調試了,設置個斷點試試。

 

 

 

參考:

VC++的DLL應用(含Demo演示)

作者:一點一滴的Beer http://beer.cnblogs.com/

      在大學大一的時候學的是C,然后后來大二的時候專業又開了C++這個課程,然后再后來自己又自學了一點VC++,大三的時候也試著編寫過一個MFC的最簡單的窗口程序。到大四的時候,自己又做了一個GIS的項目,是用C#.NET來編寫的,然后發現C#上手好容易,而且還大部分語法規則都沿用了C,C++的習慣,于是覺得C++實在是沒有一點優勢可言啊。但這個暑假的實習經歷又改變了我的觀點:C++在寫窗口程序雖然麻煩,但是卻什么能做,而且對比C#來說,對運行環境的要求不高,不用像C#程序在安裝之前還要安裝100M多的運行.NET環境。C++和C#各有優缺,目前我對它們倆的定位是:C++用來寫一些底層的程序,比如驅動,或者是一些算法類型的函數接口,然后用C#來調用這些接口并進行界面設計。如何函數的實現跨語言呢?顯然DLL是個很重要的內容,故在此對VC++的DLL模塊進行介紹。

1 用VC創建DLL動態連接庫

 

1.1 創建dll項目

clip_image002

然后選擇“一個空的dll工程”,然后點擊“確定”便完成了“創建dll項目”的流程。

 

1.2 為dll項目編寫源文件

新建兩個文件:dllDemo.h, dllDemo.cpp

在頭文件”dllDemo.h”中聲明三個接口函數:

extern "C" _declspec(dllexport) int Sum(int a,int b);//加法函數。
extern "C" _declspec(dllexport) int Max(int a, int b);//取較大值函數
extern "C" _declspec(dllexport) int Min(int a, int b);//取較小值函數

 

然后在“dllDemo.cpp”文件中實現三個接口函數:

 

復制代碼
#include "dllDemo.h"
extern "C" _declspec(dllexport)int Sum(int a, int b)
{
return a+b;
}
extern "C" _declspec(dllexport)int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
extern "C" _declspec(dllexport)int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}
復制代碼

 

 

1.3 生成dll文件

編譯源文件,如果沒有出現錯誤提示,那么,在項目文件根目錄的Debug文件夾內會生成一個dll文件“dllDemo.dll”。

 

 

2 DLL調用

 

2.1 用C++調用顯式鏈接

clip_image004

新建一個Win32的控制臺程序進行顯式調用:

1. 新建“dllConsoleEvident”的Win32控制臺程序項目

2. 新建cpp文件“dllConsoleEvident.cpp”

3. 將在第一節中,在Debug目錄下編譯生成的“dllDemo.dll”(顯式調用時只需要這一個文件就夠了)文件復制到“dllConsoleEvident”項目下的Debug文件夾根目錄下

4. 在“dllConsoleEvident.cpp”文件中編寫以下代碼對dll中的函數進行顯式調用

 

復制代碼
代碼
//////////////////////////////////////////////////////////////////////////
//動態加載DLL文件
#include <iostream.h>
#include
<windows.h>
void main(void)
{
typedef
int(*pMax)(int a,int b);//函數指針
typedef int(*pMin)(int a,int b);
pMax Max
=NULL;
pMin Min
=NULL;
HINSTANCE hDLL;
hDLL
=LoadLibrary("MyDll.dll");//加載動態鏈接庫MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
Min
=(pMin)GetProcAddress(hDLL,"Min");
if (Max)//如果取出函數成功,則執行下面的語句
{
int A=Max(5,8);
cout
<<"比較的結果為"<<A;
}
if (Min)
{
int B=Min(5,8);
cout
<<"比較的結果為"<<B;
}
FreeLibrary(hDLL);
//卸載MyDll.dll文件;
}
復制代碼

 

 

 

2.2 用C++隱式鏈接(Win32控制臺程序)

clip_image006

新建一個Win32控制臺程序演示靜態調用

1. 利用向導新建“dllConsoleStaticDemo”的空工程

2. 將dllDemo.dll”和“dllDemo.lib文件復制到Debug目錄下,并在項目中包含“dllDemo.lib”文件(或者),否則會出現dll函數找不到的連接錯誤

3. 新建“dllConsoleStaticDemo.cpp”文件,并寫入如下代碼:

 

復制代碼
extern "C"_declspec(dllimport) int Sum(int a,int b);
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
#include
<iostream.h>
void main()
{
int c=Sum(4,5);
c
=Max(5,6);
c
=Min(5,6);
cout
<<"Hello,dllConsoleTest~!";
}
復制代碼

 

 

 

 

4.通過斷點,可以看到dll函數調用成功

這種方式的靜態調用的特點是:在程序一開始執行的時候,就將dll文件全部加載到程序中,不會釋放。

 

2.3 用C++隱式鏈接(MFC窗口程序)

clip_image008

新建一個MFC基本對話框窗口程序進行調用:

1. 利用向導建立一個MFC基本對話框

2. 將dllDemo.dll”和”dllDemo.lib”文件復制到本項目的Debug目錄下,在VC工作空間的文件視圖下面將”dllDemo.lib”添加到項目中

3. 在“dllMfcDemoDlg.h”頭文件中的前面對來自外部的dll函數進行聲明

 

復制代碼
// dllMfcDemoDlg.h : header file
//
#if !defined(AFX_DLLMFCDEMODLG_H__E358B876_D188_48FD_8D83_794309C885A9__INCLUDED_)
#define AFX_DLLMFCDEMODLG_H__E358B876_D188_48FD_8D83_794309C885A9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CDllMfcDemoDlg dialog
extern "C"_declspec(dllimport) int Sum(int a,int b);
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
……
復制代碼

 

 

 

 

4.在窗體界面上,雙擊“確定”按鈕,進入到OnOk()的事件響應函數體,編寫調用代碼:

 

復制代碼
void CDllMfcDemoDlg::OnOK()
{
// TODO: Add extra validation here
int c=Sum(4,5);
c
=Max(5,6);
c
=Min(5,6);
CDialog::OnOK();
}
復制代碼

 

 

 

通過設置斷點單步運行就可以看到dll文件中的函數已經被成功調用了。

 

2.4 用C#跨語言調用

C#控制臺程序調用VC++建立一個dll:

clip_image010

1. 用Visual Studio建立一個控制臺程序

2. 將“dllDemo.dll”文件復制到項目的Debug目錄下面

3. 在“Program.cs”中編寫如下代碼

 

復制代碼
代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;//引入dll文件中的函數
namespace ConsoleDllDemo
{
class Program
{
//引入dll文件中的函數
[DllImport("dllDemo.dll")]
private static extern int Sum(int a, int b);
[DllImport(
"dllDemo.dll")]
private static extern int Max(int a, int b);
[DllImport(
"dllDemo.dll")]
private static extern int Min(int a, int b);
static void Main(string[] args)
{
int a = Sum(3, 5);
Console.WriteLine(a);
Console.WriteLine(Max(
5,10));
Console.WriteLine(Min(
12,25));
Console.ReadKey();
//要按鍵才退出。
}
}
}
復制代碼

 

 

 

然后斷點單步運行,便可以看到調用函數的結果了。

關于DLL的調用的更詳細內容可以參考另外一些文章:

http://dev.firnow.com/course/3_program/c++/cppsl/2008127/97781.html

http://dev.yesky.com/283/2640283_2.shtml

 

3 dll調試方法

在建立了dll項目后,并寫好相應的實現代碼,點擊“運行”,會彈出現在的對話框:

clip_image012

然后瀏覽,找到一個調用了此dll文件的執行文件“*.exe”文件,然后就可以對dll文件進行斷點調試了。

這個“*.exe”文件可以是任何平臺的,C++也可以,C也可以,C#也可以,只要這個執行文件調用了dll文件中的函數即可。

如果想更換調試的“*.exe”文件,可以在“工程-》設置”對話框中的“調試”選項卡進行設置,瀏覽找到用戶需要的“*.exe”文件

clip_image014

說明:以VC++環境中調用此dll為例,運行dllDemo項目,然后會調用“*.exe”文件,如果此exe文件含有源文件,而且剛好在源文件的Debug目錄下面,那么,可以同時在exe文件的源文件中設置斷點,進行dll和調用dll兩個程序的聯調。(好像跨語言調用的時候不能進行聯調,筆者只在C++互相調用的時候聯調成功過,但C#調用的時候沒有聯調成功,這個問題有待解決)

 

 

4. DLL返回數據類型探究

目前寫的DLL函數反返回值還僅限于整形,還沒有嘗試其它特殊類型的返回值。更豐富的返回值類型,還要今后慢慢學習和研究。等回學校了再研究吧。請見后續文章吧。

 

 

附件:

VC_dll_Realse.rar中是VC編寫DLL并引用DLL的相關源碼文件

CShapr_ConsoleDllDemo.rar中是VS2005編寫的C#引用VC編寫的DLL函數的相關源碼文件

http://files.cnblogs.com/beer/VC_dll_Realese.rar

http://files.cnblogs.com/beer/CSharp_ConsoleDllDemo.rar

------------------------------------------------------------------

posted on 2012-10-23 14:45 jackdong 閱讀(434) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线一区二区三区做爰视频网站| 欧美日韩一区高清| 欧美亚洲一区二区三区| 欧美激情女人20p| 激情成人综合网| 午夜欧美理论片| 亚洲深夜av| 欧美午夜不卡影院在线观看完整版免费| a4yy欧美一区二区三区| 亚洲一区二区三区精品在线观看| 欧美成人视屏| 亚洲国产精品va在线看黑人| 久久综合久久综合九色| 久久精品123| 激情六月婷婷综合| 免费成人小视频| 毛片一区二区三区| 亚洲欧洲日产国产综合网| 欧美福利视频| 久久综合婷婷| 亚洲区免费影片| 亚洲国产欧美一区二区三区久久| 久久av一区二区| 激情视频亚洲| 欧美激情精品久久久久久免费印度| 麻豆成人综合网| 亚洲日本乱码在线观看| 亚洲人成亚洲人成在线观看| 欧美日韩大片一区二区三区| 亚洲视频在线播放| 亚洲欧洲av一区二区三区久久| 国产人久久人人人人爽| 另类专区欧美制服同性| 欧美高清自拍一区| 亚洲一区二区三区在线观看视频 | 在线亚洲自拍| 国产精品美女久久久久久免费| 亚洲欧美在线磁力| 久久久久久999| 日韩亚洲欧美成人| 亚洲欧美电影在线观看| 在线观看欧美精品| 亚洲精品少妇网址| 国产日韩欧美不卡| 亚洲国产高清自拍| 国产精品入口夜色视频大尺度| 久久久福利视频| 欧美国产精品中文字幕| 亚洲欧美综合一区| 麻豆免费精品视频| 午夜精品久久久| 免费观看成人| 亚洲欧美国产一区二区三区| 久久天天躁狠狠躁夜夜av| 夜夜嗨av一区二区三区网页| 亚洲欧美一区二区视频| 91久久久一线二线三线品牌| 亚洲天堂第二页| 亚洲人成毛片在线播放| 午夜免费久久久久| 亚洲欧洲偷拍精品| 欧美一区二区三区免费观看视频| 日韩亚洲精品在线| 久久精品一区二区| 亚洲男女自偷自拍| 欧美黄色免费网站| 免费成人高清视频| 国产婷婷色一区二区三区四区| 91久久黄色| 亚洲欧美国产精品专区久久| 免费高清在线一区| 欧美一区二区在线| 欧美日韩国产在线播放网站| 免费亚洲一区二区| 国产亚洲欧美一区二区| 正在播放亚洲一区| 99在线观看免费视频精品观看| 久久精品国产欧美亚洲人人爽| 亚洲午夜久久久久久久久电影网| 欧美不卡一区| 欧美国产日韩亚洲一区| 激情亚洲网站| 欧美一区二区三区日韩视频| 亚洲一区二区高清视频| 欧美精品日韩三级| 亚洲成人中文| 在线观看亚洲视频| 久久久久久久久久久一区 | 久久久五月天| 国产麻豆精品theporn| 国产精品99久久99久久久二8 | 午夜在线成人av| 欧美日韩一区二区三区在线视频| 欧美国产成人精品| 亚洲高清免费视频| 久久夜色精品国产| 欧美xart系列高清| 一区二区三区在线观看视频 | 亚洲二区三区四区| 久久久水蜜桃| 欧美+日本+国产+在线a∨观看| 韩国成人福利片在线播放| 欧美在线资源| 久久亚洲精品伦理| 在线播放精品| 免费欧美在线| 亚洲欧洲精品一区二区三区不卡| 亚洲激情电影在线| 欧美高清视频www夜色资源网| 亚洲国产成人高清精品| 夜夜爽99久久国产综合精品女不卡| 欧美精品久久99| 亚洲午夜av在线| 久久精品国产欧美亚洲人人爽 | 亚洲国产91色在线| 亚洲视频导航| 国产一区二区三区视频在线观看| 久久久国产一区二区| 91久久精品一区二区三区| 亚洲一区三区在线观看| 国产婷婷一区二区| 欧美第一黄色网| 亚洲一二三四区| 美国十次成人| 一区二区久久久久久| 国产一区二区三区免费不卡| 欧美aaaaaaaa牛牛影院| 中文国产亚洲喷潮| 免费国产自线拍一欧美视频| 99人久久精品视频最新地址| 国产精品欧美一区喷水| 久久久中精品2020中文| 国产精品自拍三区| 欧美日本高清一区| 日韩视频一区二区三区| 欧美一区二区视频免费观看| 国内视频精品| 欧美久久视频| 久久国产精品99国产精| 欧美午夜欧美| 久久爱91午夜羞羞| 亚洲国产精品福利| 欧美伊人久久久久久午夜久久久久 | 亚洲精品偷拍| 久久xxxx| 99这里有精品| 亚洲大胆人体在线| 国产精品视频观看| 欧美精品久久久久久久久老牛影院| 亚洲综合首页| 亚洲人成在线免费观看| 久久成人免费视频| 亚洲深夜福利网站| 亚洲人成网站影音先锋播放| 国产日产高清欧美一区二区三区| 欧美区亚洲区| 欧美成人中文字幕| 老司机午夜免费精品视频| 亚洲欧美国产一区二区三区| 亚洲精品久久久久中文字幕欢迎你 | 久久香蕉国产线看观看av| 在线午夜精品| 亚洲精品免费电影| 久久婷婷丁香| 欧美伊人影院| 欧美一级视频一区二区| 亚洲一区二区在线看| 日韩特黄影片| 亚洲日本成人女熟在线观看| 亚洲第一精品影视| 在线观看国产精品淫| 一色屋精品亚洲香蕉网站| 国产免费亚洲高清| 国产区欧美区日韩区| 国产在线观看精品一区二区三区 | 国产视频一区在线| 国产麻豆精品视频| 欧美丝袜第一区| 欧美手机在线| 国产欧美一区二区三区在线看蜜臀| 欧美影视一区| 亚洲一区欧美一区| 午夜久久久久久| 欧美亚洲在线视频| 欧美在线观看视频| 久久久久久一区二区三区| 久久久中精品2020中文| 麻豆freexxxx性91精品| 欧美激情综合在线| 欧美日韩系列| 国产精品扒开腿做爽爽爽视频| 欧美日韩日本网| 欧美日韩国产系列| 日韩一区二区精品| 日韩午夜三级在线| 99这里只有精品| 亚洲欧美韩国| 久久久久**毛片大全| 老牛国产精品一区的观看方式| 蜜臀久久99精品久久久画质超高清|