Ⅰ 如何調用dll文件中的函數

第一種:動態鏈接主要是利用LoadLibrary、GetProcAddress、FreeLibrary這三個api。

LoadLibrary
HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);
The LoadLibrary function maps the specified executable mole into the address space of the calling process.
這個函數就是映射可執行模塊的地址到調用這個函數的進程中,以便這個進程能夠調用可執行模塊中的函數。
輸入參數: lpLibFileName 指向一個可執行模塊的名字的字符串,在這里也就是指向"sqlite3.dll"的字符指針,你也可以加路徑,請注意要用back slashes(\)代替forward slashes(/)。具體的請參看MSDN。
返回值:成功的話就返回這個可執行模塊的句柄(下面要用),否則返回NULL。
GetProcAddress
FARPROC GetProcAddress( HMODULE hMole, LPCSTR lpProcName );
The GetProcAddress function returns the address of the specified exported dynamic-link library (DLL) function.
這個函數返回動態鏈接庫(DLL)中指定函數的地址,為了下面可以調用這個指定的函數。
輸入參數:
hMole 就是調用LoadLibrary得到的句柄。
lpProcName字符指針,指向函數名(這個函數必須是dll中定義的函數)。
返回值:函數指針,是對應上面函數名的函數的入口地址。
FreeLibrary
BOOL FreeLibrary( HMODULE hLibMole );
The FreeLibrary function decrements the reference count of the loaded dynamic-link library (DLL) mole. When the reference count reaches zero, the mole is unmapped from the address space of the calling process and the handle is no longer valid.
這個函數就是釋放我們load的dll模塊。當有多次load的時候,我們一次釋放一個。
輸入參數:就是上面調用LoadLibrary得到的句柄。
返回值:失敗為0,否則為非0
下面給出一個小例子:
typedef int(*SQLITE3_OPEN)(const char *filename,sqlite3 **ppdb);
SQLITE3_OPEN sqlite3_open;
HINSTANCE hdll;
int init_dll_function(void)
{
hdll=LoadLibrary("sqlite3.dll");
if(hdll==NULL){printf("Error to LoadLibrary!\n");return 1;}
sqlite3_open=(SQLITE3_OPEN)GetProcAddress(hdll,"sqlite3_open");
if(sqlite3_open==NULL){
printf("Error!\n");
return 1;
}
if(!FreeLibrary(hdll)){
return 1;
}
return 0;
}

第二種:靜態(顯式)鏈接

第一步:
這個比較簡單,首先利用def文件生成一個lib文件。
如何用def文件生成一個lib文件?
到C:\Program Files\Microsoft Visual Studio\VC98\Bin下(如果VC是裝在C盤的話),用CMD進入到這個目錄下,然后利用lib.exe這個程序來生成所要的lib。具體的命令是:LIB /DEF:sqlite3.def /machine:IX86
。你運行了這個命令發現會有問題,因為這邊默認是sqlite3.def在當前文件夾下(C:\Program Files\Microsoft Visual Studio\VC98\Bin),如果你這個文件不在這個文件夾下,那么就會出錯,你只要把sqlite3.def文件復制到這個文件夾下就可以了,然后生成的lib文件也是在這個文件夾下的,你可以將它復制到你需要的地方。
注意:好像有的VC在安裝的時候差什么文件,運行lib.exe命令的時候會出錯,你只要找到那個差的文件并復制到當前的文件夾下,就可以了。(那個缺少文件有可能是放在其他文件夾了,你可以查找一下,我的就是這種情況)。
第二步:在程序中添加#pragma comment(lib,"sqlite3.lib") ,并且添加相應的頭文件(sqlite3.h).
第三步:就在程序中調用你想要調用的函數。

Ⅱ 如何動態調用dll中的類的函數

nniu 2011-04-06 10:46
DLL動態鏈接庫是程序復用的重要方式,DLL可以導出函數,使函數被多個程序復用,DLL中的函數實現可以被修改而無需重新編譯和連接使用該DLL的應用程序。作為一名面向對象的程序員,希望DLL可以導出類,以便在類的層次上實現復用。所幸的是,DLL確實也可以導出類。
然而事實卻沒這么簡單,導出類的DLL在維護和修改時有很多地方必需很小心,增加成員變量、修改導出類的基類等操作都可能導致意想不到的后果,也許用戶更新了最新版本的DLL庫后,應用程序就再也不能工作了。這就是著名的DLL Hell(DLL地獄)問題。
DLL地獄問題是怎么產生的呢?看下面的例子,假設DLL有一個導出類ClassD1:
class ClassD

Ⅲ 如何查看DLL中的函數

可以通過反匯編來知道接口函數的參數,建議使用W32DSM來分析,也可以直接使用VC來分析,就是麻煩一點。
現在使用W32DSM來具體說明:
1。先打開需要分析的DLL,然后通過菜單功能-》出口來找到需要分析的函數,雙擊就可以了。
它可以直接定位到該函數。
2。看準該函數的入口,一般函數是以以下代碼作為入口點的。
push ebp
mov ebp, esp
...
3。然后往下找到該函數的出口,一般函數出口有以下語句。
...
ret xxxx;//其中xxxx就是函數差數的所有的字節數,為4的倍數,xxxx除以4得到的結果
就是參數的個數。
其中參數存放的地方:
ebp+08 //第一個參數
ebp+0C //第二個參數
ebp+10 //第三個參數
ebp+14 //第四個參數
ebp+18 //第五個參數
ebp+1C //第六個參數
。。。。
-------------------------------------------
還有一種經常看到的調用方式:
sub esp,xxxx //開頭部分
//函數的內容
。。。
//函數的內容
add esp,xxxx
ret //結尾部分
其中xxxx/4的結果也是參數的個數。
-------------------------------------------------
還有一種調用方式:
有于該函數比較簡單,沒有參數的壓棧過程,
里面的
esp+04就是第一個參數
esp+08就是第二個參數
。。。
esp+xx就是第xx/4個參數
你說看到的xx的最大數除以4后的結果,就是該函數所傳遞的參數的個數。
----------------------------------------------
到現在位置,你應該能很清楚的看到了傳遞的參數的個數。至于傳遞的是些什么內容,還需要進一步的分析。
最方便的辦法就是先找到是什么軟件在調用此函數,然后通過調試的技術,找到該函數被調用的地方。一般都是PUSH指令
來實現參數的傳遞的。這時可以看一下具體是什么東西被壓入堆棧了,一般來說,如果參數是整數,一看就可以知道了,
如果是字符串的話也是比較簡單的,只要到那個地址上面去看一下就可以了。
如果傳遞的結構的話,沒有很方便的辦法解決,就是讀懂該匯編就可以了。對于以上的分析,本人只其到了拋磚引玉,

Ⅳ 如何查看DLL文件里的函數

1、準備好要看函數的dell文件,打開Dll函數查看器3.5。

Ⅳ 如何查看一個DLL文件中具體的函數

可以通過反匯編來知道接口函數的參數,建議使用W32DSM來分析,也可以直接使用VC來分析。
現在使用W32DSM來具體說明:
1。先打開需要分析的DLL,然后通過菜單功能-》出口來找到需要分析的函數,雙擊就可以了。它可以直接定位到該函數。
2。看準該函數的入口,一般函數是以以下代碼作為入口點的。
push ebp
mov ebp, esp
...
3。然后往下找到該函數的出口,一般函數出口有以下語句。
...
ret xxxx;//其中xxxx就是函數差數的所有的字節數,為4的倍數,xxxx除以4得到的結果
就是參數的個數。
其中參數存放的地方:
ebp+08 //第一個參數
ebp+0C //第二個參數
ebp+10 //第三個參數
ebp+14 //第四個參數
ebp+18 //第五個參數
ebp+1C //第六個參數
。。。。

Ⅵ 股票dll插件函數Ref 用C++語言怎么寫

是我在論壇看到的一個例子,所以記錄下來,以后用到可以參考。[DllImport("Kernel32.dll")]public static extern int LoadLibrary(String funcname);[DllImport("Kernel32.dll")]public static extern int GetProcAddress(int handle, String funcname);[DllImport("Kernel32.dll")]public static extern int FreeLibrary(int handle);//// 注意: 參數列表及返回值要與方法(test)對應..//public delegate int Invoker(string ProjName, string SchemeName, string Mile, ref double ContnMile, ref bool Reliability, ref short LineKind);static void Main(string[] args){ int handle = LoadLibrary(@"test.dll"); //要調用的類庫.. if (handle != 0) { int address = GetProcAddress(handle, "test"); //指定函數名稱.. if (address != 0) { Invoker invoker = (Invoker)Marshal.GetDelegateForFunctionPointer(new IntPtr(address), typeof(Invoker)); //use invoker -> demo: invoker(...); FreeLibrary(handle); } }}

Ⅶ 如何調用DLL中的函數

你要有函數原型,從函數原型知道函數名,要幾個參數,什么類型的參數,返回什么類型。調用時,根據這些信息填寫實際參數。

你要有這個dll的頭文件,源程序要加入這個頭文件。

編譯時,要鏈接 這個 DLL 的 .lib 文件。

例如,我要使用 winmm.dll 里的 PlaySound() 函數,播放 .wma 的歌曲。

我加入它的頭文件:

#include <mmsystem.h>

我要求編譯時鏈接 .lib:

#pragma comment(lib, "winmm.lib")

調用語句:

PlaySound (TEXT("D:/abc/ge/wanfeng.wma"), NULL, SND_ASYNC | SND_NODEFAULT);

跑程序時,程序會自己使用 winmm.dll

Ⅷ 在破解版軟件中,如何調用dll文件

從你的說法,其實就沒有完全破解(或者不切蒂),因為調用DLL就沒法進行,另外,DLL是屬庫類文件,不能直接更名(exe)使用的,是通過程序調用其中的某些函數值。DLL文件本身并不能直接運行,加密了也不能被直接打開。你的破解補丁版本高低不是直接問題,其實就是這個破解補丁根本就不能破解該版本。

Ⅸ 如何查看dll中的函數

可以通過反匯編來知道接口函數的參數,建議使用W32DSM來分析,也可以直接使用VC來分析,就是麻煩一點。
現在使用W32DSM來具體說明:
1。先打開需要分析的DLL,然后通過菜單功能-》出口來找到需要分析的函數,雙擊就可以了。
它可以直接定位到該函數。
2。看準該函數的入口,一般函數是以以下代碼作為入口點的。
push ebp
mov ebp, esp
...
3。然后往下找到該函數的出口,一般函數出口有以下語句。
...
ret xxxx;//其中xxxx就是函數差數的所有的字節數,為4的倍數,xxxx除以4得到的結果
就是參數的個數。
其中參數存放的地方:
ebp+08 //第一個參數
ebp+0C //第二個參數
ebp+10 //第三個參數
ebp+14 //第四個參數
ebp+18 //第五個參數
ebp+1C //第六個參數
。。。。
-------------------------------------------
還有一種經常看到的調用方式:
sub esp,xxxx //開頭部分
//函數的內容
。。。
//函數的內容
add esp,xxxx
ret //結尾部分
其中xxxx/4的結果也是參數的個數。
-------------------------------------------------
還有一種調用方式:
有于該函數比較簡單,沒有參數的壓棧過程,
里面的
esp+04就是第一個參數
esp+08就是第二個參數
。。。
esp+xx就是第xx/4個參數
你說看到的xx的最大數除以4后的結果,就是該函數所傳遞的參數的個數。
----------------------------------------------
到現在位置,你應該能很清楚的看到了傳遞的參數的個數。至于傳遞的是些什么內容,還需要進一步的分析。
最方便的辦法就是先找到是什么軟件在調用此函數,然后通過調試的技術,找到該函數被調用的地方。一般都是PUSH指令
來實現參數的傳遞的。這時可以看一下具體是什么東西被壓入堆棧了,一般來說,如果參數是整數,一看就可以知道了,
如果是字符串的話也是比較簡單的,只要到那個地址上面去看一下就可以了。
如果傳遞的結構的話,沒有很方便的辦法解決,就是讀懂該匯編就可以了。對于以上的分析,本人只其到了拋磚引玉,
希望對大家有點用處。