欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

c語言將函數(shù)封裝到靜態(tài)庫(kù) c語言怎么把函數(shù)封裝到庫(kù)中

如何建立自己的函數(shù)庫(kù)(C語言codeblocks)

你的函數(shù)庫(kù)是否是指將自己寫的那些函數(shù)封裝到一個(gè)頭文件里面,在用的時(shí)候調(diào)用???

成都創(chuàng)新互聯(lián)公司客戶idc服務(wù)中心,提供成都服務(wù)器托管、成都服務(wù)器、成都主機(jī)托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價(jià)的產(chǎn)品以及開放、透明、穩(wěn)定、高性價(jià)比的服務(wù),資深網(wǎng)絡(luò)工程師在機(jī)房提供7*24小時(shí)標(biāo)準(zhǔn)級(jí)技術(shù)保障。

如果這樣,就要建立一個(gè).h文件和一個(gè).c文件,并且,.c文件和.h文件的名字要一樣,在你的這個(gè).c文件里面添加你的那些函數(shù),然后在.h文件里面用extern將這個(gè)函數(shù)聲明一下,這樣當(dāng)你包含這個(gè)頭文件的時(shí)候,你的其他的文件就可以調(diào)用這個(gè)文件的函數(shù)了,樓上所說的開放的接口也就是你要調(diào)用的函數(shù)的接口,放在頭文件里面關(guān)于頭文件的制作各式,網(wǎng)上貌似可以搜到……

請(qǐng)教高手教一下用gcc編譯c語言函數(shù),再合并為靜態(tài)庫(kù),最后調(diào)用的過程。

應(yīng)該編譯成.a文件

ar rc c:\libab.a c:\a.o c:\b.o

然后,再編譯執(zhí)行文件

gcc -o c:\m.exe c:\m.c -LC:\ -lab

你這樣試試

在C語言中怎么將函數(shù)添加到函數(shù)庫(kù)中非常具體的步驟,越具體越好

你用的什么環(huán)境,我以前只會(huì)用TC弄,現(xiàn)在也有些忘了 .先用TCC命令生成OBJ,再用TLIB命令加到函數(shù)庫(kù),我記得好像不是哪個(gè)庫(kù)都能加成功的,你試試那幾個(gè)庫(kù),哪個(gè)可以.

C語言中如何將自己常用的函數(shù)封裝到編譯器的庫(kù)函數(shù)中具體應(yīng)該怎么做呢?

用編譯器提供的庫(kù)管理工具。

C語言的編譯器都會(huì)提供一個(gè)命令行工具,可以把自己編譯后的.obj模塊加入指定的庫(kù)文件,以后使用時(shí)只需要連接該庫(kù)文件即可。這個(gè)命令行工具通常是lib.exe,用這個(gè)工具可以查看庫(kù)中的模塊,可以把模塊加入到庫(kù)中,可以從庫(kù)中刪除模塊。這個(gè)工具不僅僅是自己建立的庫(kù)文件的管理工具,可以管理所有的庫(kù)文件,包括C語言提供的標(biāo)準(zhǔn)庫(kù)。

c語言中要封裝一個(gè)函數(shù)( 比如什么printf之類的),肯定得用.c和.h文件,函數(shù)聲明在.h文件中.函數(shù)實(shí)現(xiàn)在c文

//mvector.h?--?聲明

#ifndef?MVECTOR_H_

#define?MVECTOR_H_??

typedef?struct?_mvect

{

int?x;

int?y;

}vect;

void?getvect(vect*?v);//聲明

void?showvect(vect?v);//聲明

#endif

//mvector.c?--?實(shí)現(xiàn)

#include?"mvector.h"

#include?stdio.h?

void?getvect(vect*?v)

{

scanf("%d,%d",(v-x),(v-y));??

}??

void?showvect(vect?v)

{

printf("%d,%d",v.x,v.y);??

}

//main.c?--?使用

#include?"mvector.h"

#include?stdio.h

int?main()

{

vect?a;

getvect(a);

showvect(a);

}

注意mvector.h必須位于當(dāng)前文件夾下,且必須把mvector.c和main.c放在一個(gè)工程里編譯。

輸入:2,3

輸出:2,3

C#能否通過用C++把靜態(tài)庫(kù)lib封裝到一個(gè)dll中的方式實(shí)現(xiàn)調(diào)用lib中的函數(shù)?

可以得。將C++的lib庫(kù)修改為dll,然后可以被C#調(diào)用。

下面說說c#調(diào)用DLL的注意點(diǎn)

首先,您需要了解什么是托管,什么是非托管。一般可以認(rèn)為:非托管代碼主要是基于win

32平臺(tái)開發(fā)的DLL,activeX的組件,托管代碼是基于.net平臺(tái)開發(fā)的。

(一) 調(diào)用DLL中的非托管函數(shù)一般方法

首先,應(yīng)該在C#語言源程序中聲明外部方法,其基本形式是:

[DLLImport(“DLL文件”)] 修飾符 extern 返回變量類型 方法名稱 (參數(shù)列表)

其中:

DLL文件:包含定義外部方法的庫(kù)文件。

修飾符: 訪問修飾符,除了abstract以外在聲明方法時(shí)可以使用的修飾符。

返回變量類型:在DLL文件中你需調(diào)用方法的返回變量類型。

方法名稱:在DLL文件中你需調(diào)用方法的名稱。

參數(shù)列表:在DLL文件中你需調(diào)用方法的列表。

注意:需要在程序聲明中使用System.Runtime.InteropServices命名空間。

DllImport只能放置在方法聲明上。

DLL文件必須位于程序當(dāng)前目錄或系統(tǒng)定義的查詢路徑中(即:系統(tǒng)環(huán)境變量中Path所設(shè)置的路徑)。

返回變量類型、方法名稱、參數(shù)列表一定要與DLL文件中的定義相一致。

若要使用其它函數(shù)名,可以使用EntryPoint屬性設(shè)置,如:

[DllImport("user32.dll", EntryPoint="MessageBoxA")]

static extern int MsgBox(int hWnd, string msg, string caption, int type);

其它可選的 DllImportAttribute 屬性:

CharSet 指示用在入口點(diǎn)中的字符集,如:CharSet=CharSet.Ansi;

SetLastError 指示方法是否保留 Win32"上一錯(cuò)誤",如:SetLastError=true;

ExactSpelling 指示 EntryPoint 是否必須與指示的入口點(diǎn)的拼寫完全匹配,如:ExactSpelling=false;

PreserveSig指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換, 如:PreserveSig=true;

CallingConvention指示入口點(diǎn)的調(diào)用約定, 如:CallingConvention=CallingConvention.Winapi;

此外,關(guān)于“數(shù)據(jù)封送處理”及“封送數(shù)字和邏輯標(biāo)量”請(qǐng)參閱其它一些文章。

C#操作舉例:

1. 啟動(dòng)VS.NET,新建一個(gè)項(xiàng)目,項(xiàng)目名稱為“Tzb”,模板為“Windows 應(yīng)用程序”;

2. 在“工具箱”的“ Windows 窗體”項(xiàng)中雙擊“Button”項(xiàng),向“Form1”窗體中添加一個(gè)按鈕;

3. 改變按鈕的屬性:Name為 “B1”,Text為 “用DllImport調(diào)用DLL彈出提示框”,并將按鈕B1調(diào)整到適當(dāng)大小,移到適當(dāng)位置;

4. 在類視圖中雙擊“Form1”,打開“Form1.cs”代碼視圖,在“namespace Tzb”上面輸入“using System.Runtime.InteropServices;”,以導(dǎo)入該命名空間;

5. 在“Form1.cs[設(shè)計(jì)]”視圖中雙擊按鈕B1,在“B1_Click”方法上面使用關(guān)鍵字 static 和

extern 聲明方法“MsgBox”,將 DllImport 屬性附加到該方法,這里我們要使用的是“user32.dll”中的“MessageBoxA”函數(shù),具體代碼如下:

[DllImport("user32.dll", EntryPoint="MessageBoxA")]

static extern int MsgBox(int hWnd, string msg, string caption, int type);

然后在“B1_Click”方法體內(nèi)添加如下代碼,以調(diào)用方法“MsgBox”:

MsgBox(0," 這就是用 DllImport 調(diào)用 DLL 彈出的提示框哦! "," 挑戰(zhàn)杯 ",0x30);

6. 按“F5”運(yùn)行該程序,并點(diǎn)擊按鈕B1即可。

(二) 動(dòng)態(tài)裝載、調(diào)用DLL中的非托管函數(shù)

在上面已經(jīng)說明了如何用DllImport調(diào)用DLL中的非托管函數(shù),但是這個(gè)是全局的函數(shù),假若DLL中的非托管函數(shù)有一個(gè)靜態(tài)變量S,每次調(diào)用這個(gè)函數(shù)的時(shí)候,靜態(tài)變量S就自動(dòng)加1。結(jié)果,當(dāng)需要重新計(jì)數(shù)時(shí),就不能得出想要的結(jié)果。

下面將用例子說明:

1. DLL的創(chuàng)建

1) 啟動(dòng)Visual C++ 6.0;

2) 新建一個(gè)“Win32 Dynamic-Link Library”工程,工程名稱為“Count”;

3) 在“Dll kind”選擇界面中選擇“A simple dll project”;

4) 打開Count.cpp,添加如下代碼:

// 導(dǎo)出函數(shù),使用“ _stdcall ” 標(biāo)準(zhǔn)調(diào)用

extern "C" _declspec(dllexport)int _stdcall count(int init);

int _stdcall count(int init)

{//count 函數(shù),使用參數(shù) init 初始化靜態(tài)的整形變量 S ,并使 S 自加 1 后返回該值

static int S=init;

S++;

return S;

}

5) 按“F7”進(jìn)行編譯,得到Count.dll(在工程目錄下的Debug文件夾中)。

2. 用DllImport調(diào)用DLL中的count函數(shù)

1) 打開項(xiàng)目“Tzb”,向“Form1”窗體中添加一個(gè)按鈕。

2) 改變按鈕的屬性:Name為 “B2”,Text為 “用DllImport調(diào)用DLL中count函數(shù)”,并將按鈕B1調(diào)整到適當(dāng)大小,移到適當(dāng)位置。

3) 打開“Form1.cs”代碼視圖,使用關(guān)鍵字 static 和 extern 聲明方法“count”,并使其具有來自 Count.dll 的導(dǎo)出函數(shù)count的實(shí)現(xiàn),代碼如下:

[DllImport("Count.dll")]

static extern int count(int init);

4) 在“Form1.cs[設(shè)計(jì)]”視圖中雙擊按鈕B2,在“B2_Click”方法體內(nèi)添加如下代碼:

MessageBox.Show(" 用 DllImport 調(diào)用 DLL 中的 count 函數(shù), n 傳入的實(shí)參為 0 ,得到的結(jié)果是: "+count(0).ToString()," 挑戰(zhàn)杯 ");

MessageBox.Show(" 用 DllImport 調(diào)用 DLL 中的 count 函數(shù), n 傳入的實(shí)參為 10 ,得到的結(jié)果是: "+count(10).ToString()+"n 結(jié)果可不是想要的 11 哦?。。?"," 挑戰(zhàn)杯 ");

MessageBox.Show(" 所得結(jié)果表明: n 用 DllImport 調(diào)用 DLL 中的非托管 n 函數(shù)是全局的、靜態(tài)的函數(shù)?。?! "," 挑戰(zhàn)杯 ");

5) 把Count.dll復(fù)制到項(xiàng)目“Tzb”的binDebug文件夾中,按“F5”運(yùn)行該程序,并點(diǎn)擊按鈕B2,便彈出如下三個(gè)提示框。

第1個(gè)提示框顯示的是調(diào)用“count(0)”的結(jié)果,第2個(gè)提示框顯示的是調(diào)用“count(10)”的結(jié)果,由所得結(jié)果可以證明“用DllImport調(diào)用DLL中的非托管函數(shù)是全局的、靜態(tài)的函數(shù)”。所以,有時(shí)候并不能達(dá)到我們目的,因此我們需要使用下面所介紹的方法:C#動(dòng)態(tài)調(diào)用

DLL中的函數(shù)。

3. C#動(dòng)態(tài)調(diào)用DLL中的函數(shù)

因?yàn)镃#中使用DllImport是不能像動(dòng)態(tài)load/unload assembly那樣,所以只能借助API函數(shù)了。在kernel32.dll中,與動(dòng)態(tài)庫(kù)調(diào)用有關(guān)的函數(shù)包括[3]:

1) LoadLibrary(或MFC 的AfxLoadLibrary),裝載動(dòng)態(tài)庫(kù);

2) GetProcAddress,獲取要引入的函數(shù),將符號(hào)名或標(biāo)識(shí)號(hào)轉(zhuǎn)換為DLL內(nèi)部地址;

3) FreeLibrary(或MFC的AfxFreeLibrary),釋放動(dòng)態(tài)鏈接庫(kù)。

它們的原型分別是:

HMODULE LoadLibrary(LPCTSTR lpFileName);

FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);

BOOL FreeLibrary(HMODULE hModule);

現(xiàn)在,我們可以用IntPtr hModule=LoadLibrary(“Count.dll”);來獲得Dll的句柄,用IntPtr farProc=GetProcAddress(hModule,”_count@4”);來獲得函數(shù)的入口地址。

但是,知道函數(shù)的入口地址后,怎樣調(diào)用這個(gè)函數(shù)呢?因?yàn)樵贑#中是沒有函數(shù)指針的,沒有像C++那樣的函數(shù)指針調(diào)用方式來調(diào)用函數(shù),所以我們得借助其它方法。經(jīng)過研究,發(fā)現(xiàn)我們可以通過結(jié)合使用System.Reflection.Emit及System.Reflection.Assembly里的類和函數(shù)達(dá)到我們的目的。為了以后使用方便及實(shí)現(xiàn)代碼的復(fù)用,我們可以編寫一個(gè)類。

1. 打開項(xiàng)目“Tzb”,打開類視圖,右擊“Tzb”,選擇“添加”--“類”,類名設(shè)置為“dld”,即dynamic loading dll 的每個(gè)單詞的開頭字母;

2. 添加所需的命名空間及聲明參數(shù)傳遞方式枚舉:

using System.Runtime.InteropServices; // 用 DllImport 需用此 命名空間

using System.Reflection; // 使用 Assembly 類需用此 命名空間

using System.Reflection.Emit; // 使用 ILGenerator 需用此 命名空間

在“public class dld”上面添加如下代碼聲明參數(shù)傳遞方式枚舉:

/// summary

/// 參數(shù)傳遞方式枚舉 ,ByValue 表示值傳遞 ,ByRef 表示址傳遞

/// /summary

public enum ModePass

{

ByValue = 0x0001,

ByRef = 0x0002

}

3. 聲明LoadLibrary、GetProcAddress、FreeLibrary及私有變量hModule和farProc:

/// summary

/// 原型是 :HMODULE LoadLibrary(LPCTSTR lpFileName);

/// /summary

/// param name="lpFileName"DLL 文件名 /param

/// returns 函數(shù)庫(kù)模塊的句柄 /returns

[DllImport("kernel32.dll")]

static extern IntPtr LoadLibrary(string lpFileName);

/// summary

/// 原型是 : FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);

/// /summary

/// param name="hModule" 包含需調(diào)用函數(shù)的函數(shù)庫(kù)模塊的句柄 /param

/// param name="lpProcName" 調(diào)用函數(shù)的名稱 /param

/// returns 函數(shù)指針 /returns

[DllImport("kernel32.dll")]

static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

/// summary

/// 原型是 : BOOL FreeLibrary(HMODULE hModule);

/// /summary

/// param name="hModule" 需釋放的函數(shù)庫(kù)模塊的句柄 /param

/// returns 是否已釋放指定的 Dll/returns

[DllImport("kernel32",EntryPoint="FreeLibrary",SetLastError=true)]

static extern bool FreeLibrary(IntPtr hModule);

/// summary

/// Loadlibrary 返回的函數(shù)庫(kù)模塊的句柄

/// /summary

private IntPtr hModule=IntPtr.Zero;

/// summary

/// GetProcAddress 返回的函數(shù)指針

/// /summary

private IntPtr farProc=IntPtr.Zero;

4. 添加LoadDll方法,并為了調(diào)用時(shí)方便,重載了這個(gè)方法:

/// summary

/// 裝載 Dll

/// /summary

/// param name="lpFileName"DLL 文件名 /param

public void LoadDll(string lpFileName)

{

hModule=LoadLibrary(lpFileName);

if(hModule==IntPtr.Zero)

throw(new Exception(" 沒有找到 :"+lpFileName+"." ));

}

若已有已裝載Dll的句柄,可以使用LoadDll方法的第二個(gè)版本:

public void LoadDll(IntPtr HMODULE)

{

if(HMODULE==IntPtr.Zero)

throw(new Exception(" 所傳入的函數(shù)庫(kù)模塊的句柄 HMODULE 為空 ." ));

hModule=HMODULE;

}

5. 添加LoadFun方法,并為了調(diào)用時(shí)方便,也重載了這個(gè)方法,方法的具體代碼及注釋如下:

/// summary

/// 獲得函數(shù)指針

/// /summary

/// param name="lpProcName" 調(diào)用函數(shù)的名稱 /param

public void LoadFun(string lpProcName)

{ // 若函數(shù)庫(kù)模塊的句柄為空,則拋出異常

if(hModule==IntPtr.Zero)

throw(new Exception(" 函數(shù)庫(kù)模塊的句柄為空 , 請(qǐng)確保已進(jìn)行 LoadDll 操作 !"));

// 取得函數(shù)指針

farProc = GetProcAddress(hModule,lpProcName);

// 若函數(shù)指針,則拋出異常

if(farProc==IntPtr.Zero)

throw(new Exception(" 沒有找到 :"+lpProcName+" 這個(gè)函數(shù)的入口點(diǎn) "));

}

/// summary

/// 獲得函數(shù)指針

/// /summary

/// param name="lpFileName" 包含需調(diào)用函數(shù)的 DLL 文件名 /param

/// param name="lpProcName" 調(diào)用函數(shù)的名稱 /param

public void LoadFun(string lpFileName,string lpProcName)

{ // 取得函數(shù)庫(kù)模塊的句柄

hModule=LoadLibrary(lpFileName);

// 若函數(shù)庫(kù)模塊的句柄為空,則拋出異常

if(hModule==IntPtr.Zero)

throw(new Exception(" 沒有找到 :"+lpFileName+"." ));

// 取得函數(shù)指針

farProc = GetProcAddress(hModule,lpProcName);

// 若函數(shù)指針,則拋出異常

if(farProc==IntPtr.Zero)

throw(new Exception(" 沒有找到 :"+lpProcName+" 這個(gè)函數(shù)的入口點(diǎn) "));

}

6. 添加UnLoadDll及Invoke方法,Invoke方法也進(jìn)行了重載:

/// summary

/// 卸載 Dll

/// /summary

public void UnLoadDll()

{

FreeLibrary(hModule);

hModule=IntPtr.Zero;

farProc=IntPtr.Zero;

}

網(wǎng)站欄目:c語言將函數(shù)封裝到靜態(tài)庫(kù) c語言怎么把函數(shù)封裝到庫(kù)中
本文路徑:http://chinadenli.net/article12/dodscgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站改版、用戶體驗(yàn)、微信小程序品牌網(wǎng)站建設(shè)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)