當前位置:首頁 » 股票漲停 » 股票軟體中使用dll函數

股票軟體中使用dll函數

發布時間: 2021-09-21 23:40:07

❶ DLL函數查看器,支持64位DLL查看順便問下如何調用64位DLL

這個問題最終是這樣解決的:我使用WDF重新編寫了驅動程序,在32bit平台上調試通過之後,更換到64bit平台上,很容易就生成了64bit的驅動文件,在64bit平台上,完全可以使用32bit的DLL和32bit的進程。因此我的軟體不用做任何改動,在64bit平台上直接使用。

因為我對COM技術不是很熟悉,所以我使用了一種曲線救國的方式。
總結:
32bit的進程是可以調用64bit的驅動(sys文件)的;但是32bit的進程不能調用64bit的進程,例如我的32bit的VB軟體就不能夠調用64bit的DLL。

❷ 如何調用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插件函數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是屬庫類文件,不能直接更名(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指令
來實現參數的傳遞的。這時可以看一下具體是什麼東西被壓入堆棧了,一般來說,如果參數是整數,一看就可以知道了,
如果是字元串的話也是比較簡單的,只要到那個地址上面去看一下就可以了。
如果傳遞的結構的話,沒有很方便的辦法解決,就是讀懂該匯編就可以了。對於以上的分析,本人只其到了拋磚引玉,
希望對大家有點用處。

❼ 如何查看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中的函數

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

你要有這個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中的函數

函數的獲取你是沒問題了,反正就是getprocaddress。主要考慮參數

long, int, char*在32位vc編譯器下實質上是一樣的,都是4個位元組的整數
所以關鍵是你要確定參數的類型,這個不能確定的話,可以說是沒辦法把代碼寫下去的。

但是光憑客戶端發來的消息,事實上沒辦法完全確定參數的類型:雖然某些情況你可以確定這個參數一定是char*,但是你沒辦法確定比如 1234 這東西到底要表達的是字元串的1234還是數字的1234。如果你能解決這個問題,確定下來,你就沒問題了,用相對統一的代碼來處理。具體可以參考下面的例子。

也就是說,你只要保證編譯後的代碼沒問題就可以了,源代碼這邊,類型再怎麼詭異和不匹配也沒關系。明明dll裡面參數要char*,你源代碼寫作int,但是到最後送進去的是一個字元串地址強制轉成的int,它也能正常運行。

所以一個簡單的方法,假如所有函數都是只有一個參數的,那麼定義成
int (*f)(int);
就ok了。它返回void也好返回char*也好,強制轉一下就能正常(返回struct和返回double這一類特殊情況不行),參數要struct *也好要long也好,強制轉一下就正常(struct作參數和double這一類目測要特殊處理)。

以下僅供參考:
void (*f)(int) = (void (*)(int)) GetProcAddress("aa");
f(123);

void (*f)(long) = (void (*)(long)) GetProcAddress("aa");
f(123);
是一樣的。

以及
void (*f)(char*) = (void (*)(char*)) GetProcAddress("bb");
f("aaa");

void (*f)(int) = (void (*)(int)) GetProcAddress("bb");
f((int)"aaa");
是一樣的

熱點內容
股市裡通融是什麼意思 發布:2024-05-03 07:06:15 瀏覽:762
股市裡的缺口如何補 發布:2024-05-03 06:58:59 瀏覽:178
股市內外比大說明什麼 發布:2024-05-03 06:58:50 瀏覽:570
什麼炒股軟體選股比較好 發布:2024-05-03 06:52:56 瀏覽:156
一線游資到底是怎麼炒股的 發布:2024-05-03 06:31:26 瀏覽:454
怎麼看指數基金哪個好 發布:2024-05-03 06:03:22 瀏覽:263
四川潤草科技有限公司的股票代碼 發布:2024-05-03 05:45:35 瀏覽:917
什麼炒股軟體可以查看全天的異動 發布:2024-05-03 05:33:59 瀏覽:26
兩條線怎麼炒股 發布:2024-05-03 05:21:49 瀏覽:692
股票軟體上的q 發布:2024-05-03 05:19:59 瀏覽:402