易語言調用c語言dll
1. 易語言如何調用c語言載入的Dll---請高手指點。
在易語言的左邊功能選項找---程序---dl命令--右鍵---插入新dll命令 DLL命令名=你給他的名稱(在窗口程序下可直接代碼輸入) DLL庫文件名=你調用那個DLL命名 DDL庫中的對應名=在被調用的DLL的子程序完了後直接在窗口下輸入代碼(DLL命令名) 打包的時候將DLL放置包下(可減少錯誤率)
2. 易語言調用C語言的dll堆棧錯誤!
調用方式是不是一樣?易語言裡面如果有能設置的話,把函數的調用方式設置成Cdecl或者
C語言方式
之類之類……沒用過易語言不知道怎麼設。不過多半是這個問題
實在找不到設置的地方的話,C語言代碼改改,
int
add(int
a,int
b)
改成
int
__stdcall
add(int
a,int
b)
3. 學習易語言,TC,按鍵精靈,這三個軟體如何選擇,說明各有什麼好處
按鍵精靈,tc簡單開發,易語言 哪個更好?
按鍵精靈,學習容易。
TC簡單開發,學習要難一些。
一、是因為TC採用C語言,C++系列語法。採用C語言,C++系列框架。
二、TC起步遲一些,TC的教程少,用戶少,討論的問題少,網路找到的答案少。
沒有同學討論,學習的難度是很大的。
//
新手學習TC還是按鍵好!
TC使用C語言系列的語法。TC是很簡單的。
C語言是鍛煉編程功力的語言。本來C語言已經很簡單了。學過C語言再回頭看TC,你會覺得,TC比C語言還簡單。
怎麼解釋呢?
TC語言,每句代碼的後面,不用加分號;
C語言中,每一句代碼的結束,不會少; 這樣明白了吧!C語言很多都要加的,TC都省略了。
………………
………………
TC簡單開發,類似C語言。
學C語言- C++ - java語言的人,選擇TC簡單開發。你會發現這些跟C語言很像。
按鍵精靈類似VBS。
學VBS語言,Basic語言,戚嘩選擇按鍵精靈。因為很多高級腳本 要用VBS語言。
………………
………………
按鍵精靈,優勢是做模擬掛,滑鼠鍵盤,找圖找色。
TC也能做模擬掛,滑鼠鍵盤,找圖找色。TC的世睜優勢是做內存掛,因為它使用C語言,C++系列語法。
C語言,C++的最強項:直接操作內存地址,直接操作指針變數。
………………
………………
多線程。
新手不建議操作多線程,臨界區這些。
TC支持多線程,並且有真多線程。按鍵精靈沒有真多線程。這個功能我們向官方呼籲很久了,官方還是用個假多線程。
按鍵開10多個線程,線程就不穩了。TC簡單開發開40個線程,還是穩如狗。
按鍵精靈的多個線程,代碼糊成一團。糊在一代碼框。TC的多個線程,可以糊成一團。但樓主喜歡新建多個***.t 源文件。把每個線程分割到一個界面。方便維護。
TC的變數,必須用 var 來定義。按鍵精靈的變數,可定義,可不定義。
這種做法看似方便,實際上並不嚴謹。在後台腳本中,不Dim 的變數,會莫名其妙的出錯,這種錯誤特難找到。
………………
………………
代碼框架。代碼的可維護性。
如果你是商業腳本作者,你才需要關心這點。如果你自己隨便玩玩,可以跳過這個。
做好商業腳本後,腳本的維護,就成了一個大的工作量。
按鍵的腳本使用一個面版顯示,然後商業界面,還要另外維護一份VB界面的代碼。當寫按鍵的腳本後到了5000行後,代碼維護就變的異常麻煩。5000行代碼,很難閱讀,經常會出問題。
TC的腳本管理,跟VS2013合集,的VC++2013比較像。項目管理,空間封裝功能,功能封裝代碼。一個項目可以擁有有多個源文件。
當項目比較大,編寫上萬行代碼,又可以把代碼分割到幾個框架。
主線程.t 一個框架。
找怪打怪.t 一個框架。
補紅補藍.t 一個框架。
定點回位.t 一個框架。
回城補給.t 一個框架。
監護線程.t 一個框架。
在IDE的左上角,右鍵_項目管理-****,添加_新建文件/現有文件。這樣,一個***.t源文件就建設好了。
這樣用構造框架來寫代碼,就變的搜仔歲很舒服了。
***.t源文件相當於按鍵精靈的命令庫,一次編寫,多次調用。並且可以擁有多個副本,修改副本不影響原件。
總結:
TC更適合做商業腳本,或者大項目,按鍵精靈編寫代碼,只有一個代碼框,管理起來很麻煩。
………………
………………
擴展性。
TC簡單開發,能調用標准介面dll(dllcall命令),COM介面dll。
按鍵精靈,能調用COM介面dll。不能調用 標准介面dll。
TC簡單開發,
支持結構體,可以自定義數據類型。這樣能調用所有的api函數。包括:普通傳參api(傳值),引用傳參api(傳址)。
結構體類api(傳值),結構體類_引用傳參api(結構體傳址)。
按鍵精靈,不支持結構體。只能調用1/2的系統api。
TC簡單開發,支持回調函數。
TC能夠像易語言,VC++ 一樣,調用系統應用層的hook。如滑鼠hook,鍵盤hook,滾動條hook,窗口消息hook。
還可以調用api_hook,直接hook系統api函數。
按鍵精靈,不支持回調函數。不能操作鉤子函數。
………………
………………
兩個軟體的潛力比較:
按鍵精靈使用VBS語言。VBS少人使用了,後勁不足。
TC使用C語言,C++的語法,
C語言,C++的程序員比比皆是,能找來參考的代碼,非常之多。C++語言強大,無所不能。
步步為營,你可以寫一些游戲腳本,辦公輔助,自娛自樂。
進一步發展,你可以下載VS2013合集,安裝VC++2013。它們的語法規則是一樣的,都使用C系列語法。
這是一種進可攻,退可守的戰法。
按鍵傍上VBS,TC傍上VC++。
這樣看,TC的潛力強大,後勁充足。如果發展得好,TC的前途不可限量。
//
總結:
按鍵精靈開始的容易,後面的難。(難於維護,難於內存操作。)
TC開始學的麻煩,後面的容易。(維護方便,讀寫內存,操作指針。)
按鍵精靈,TC簡單開發是腳本語言。
易語言是真正的語言。易語言相比按鍵精靈/TC簡單開發,要強大很多,但上手難度也大。易語言也有軟肋:沒有指針類型。不能操作指針變數。VB的中文版。
4. 易語言怎麼調用c語言編譯器來運行程序代碼 ! 急!謝謝回答者!說詳細些
如果易語言編譯器容許您,那麼就是可以的,例如keilc51編譯器和常用調試arm裸機程序,是可以在c語言語句中加入匯編語言。
由於本人不了解易語言,無法確定其編譯器是否可以編譯c,但估計是不行。
那麼說回來,如果這樣,程序就沒法寫了。實際大家是怎麼做的呢。通常做法是將c語言程序編譯成dll文件,也就是我們所謂的庫文件。然後就可以實現調用了。這種文件我們經常會在常見的程序中看到,原因就是代碼保密性好,並且更新很方便,關鍵在於可以多種語言交互。
當然了,也可以吧所謂的易語言封裝成dll,被c調用,當然如果他有這項功能的話。
如果一個c語言已經編譯成可執行程序了,比如exe文件,那麼易語言端應與c語言端進行進程通信,方可實現數據交互。那麼進程通信就有多種方式,那麼就不贅述了。
說下DLL的封裝,如果是c語言我們需要加入dll.h
dll.h中放入以下語句
#ifndef_DLL_H_
#define_DLL_H_
#ifBUILDING_DLL
#defineDLLIMPORT__declspec(dllexport)
#else/*NotBUILDING_DLL*/
#defineDLLIMPORT__declspec(dllimport)
#endif/*NotBUILDING_DLL*/
DLLIMPORTvoidHelloWorld(void);
#include"func.h"
#endif/*_DLL_H_*/
程序中的,DLLIMPORTvoidHelloWorld(void);,#include"func.h"是例子,就是放你書寫的用c寫的函數聲明的地方。
而在你c語言原先放主函數的那個文件中應該寫入以下內容
/*Replace"dll.h"withthenameofyourheader*/
#include"dll.h"
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
BOOLAPIENTRYDllMain(HINSTANCEhInst/*Libraryinstancehandle.*/,
DWORDreason/*.*/,
LPVOIDreserved/*Notused.*/)
{
switch(reason)
{
caseDLL_PROCESS_ATTACH:
break;
caseDLL_PROCESS_DETACH:
break;
caseDLL_THREAD_ATTACH:
break;
caseDLL_THREAD_DETACH:
break;
}
/*ReturnsTRUEonsuccess,FALSEonfailure*/
returnTRUE;
}
我們看見有很多case,也有很多傳入參數,最初可以不用管它,也可以使用。如需詳細配置,應自行梳理再做決定。
另外一點,對於高級語言和c語言清理現場的問題,也就是被調用函數結束後由被調用函數清理棧,還是由下一個被執行函數清理上一個函數的棧,這點很重要。兩種不同的調用方式將導致你雖然可以調用dll,但可能數據出錯。這個問題可以說在VB與C的交互上面就可以體現了。__cdecl這個就是默認c語言的棧處理方式。__stdcall是VB的處理方式,那麼對於易語言,請您詳細查看後再做定論。
那麼具體在c語言中提現就是,我們需要在函數前面加上__stdcall以告知編譯器採用此類編譯方式,應用方法就如下面的聲明。
#ifndef_FUNC_H_
#define_FUNC_H_
#include"dll.h"
#include<winsock2.h>
#include"var.h"
DLLIMPORT__(int*PercentNum,int*FileID,int*PackageID);
DLLIMPORT__stdcallintGetInfoNum(intMode);
DLLIMPORT__stdcallvoidPutInfoNum(intInfoNum,intMode);
DLLIMPORT__stdcallvoidDemo0(void);
DLLIMPORT__stdcallvoidDemo1(void);
DLLIMPORT__(void);
DLLIMPORT__(void);
#endif/*_FUNC_H_*/
我聽說VB和易語言有相似之處那麼我給出VB調用C語言DLL時候的函數書寫例子,以便您參考。
PublicClassForm1
PrivateDeclareSubNetToWorkLib"Client.dll"(ByValIpAddrAsString,ByValPortAsInteger,ByValModeAsInteger)
"Client.dll"(ByValStrAsString,ByValModeAsInteger)AsInteger
"Client.dll"(ByValStrAsString,ByValModeAsInteger)AsInteger
"Client.dll"(ByValModeAsInteger)AsInteger
"Client.dll"(ByValInfoNumAsInteger,ByValModeAsInteger)
PrivateDeclareSubDemo0Lib"Client.dll"()
PrivateDeclareSubDemo1Lib"Client.dll"()
.........
...
..
...
PrivateSubToolStripButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesToolStripButton1.Click
'從text搜索關鍵詞並讀取回鏈表數據
DimStrAsString
If(ToolStripTextBox1.Text="")Then
MsgBox("內容不能為空")
Else
Str=ToolStripTextBox1.Text
StrToStruct(Str,SEND_SEARCH_0200)
DimTh0AsThreading.Thread
Th0=NewThreading.Thread(AddressOfDownFileList)
Th0.Start()
EndIf
EndSub
....
..
上程序但中StrToStruct(Str, SEND_SEARCH_0200)就是一個典型的VB調用DLL函數的例子。
那麼如果給些相關的參考資料(C語言封裝DLL以及VB調用的問題)
http://www.aidianying123.net/article/?29.html
以便您對此更加了解。