易語言調用cdll
❶ 易語言怎麼調用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
以便您對此更加了解。
❷ 易語言可不可以調用c#生成的DLL,怎麼搞,注意事項,謝謝
可以調用C#編寫的dll,不過要注意以下事項:
1、導出函數應採用標准方式聲明,即必須以C風格聲明(如:函數加前綴「WINAPI」等修飾)導出函數,易語言只支持標準的C風格導出函數,導出函數聲明不正確的話調用時可能出現堆棧錯誤;
2、導出函數的參數不應包含C#支持但易語言不支持的特性,否則用易語言無法調用;
3、使用了C#編寫的dll後,可能需要附帶上.net運行時組件,因為不是所有的機器上都有,如果別人的機器上沒有,那麼你的程序就無法運行了。
❸ 《易語言》調用dll 錯誤信息:無法找到指定dll庫文件「xx.dll」中的輸出命令「xx」
你好我來回答你的問題,易語言找不到dll地址,他是在vb的基礎上導入dll,你的dll如果沒有問題,請在庫名稱中寫dll的具體位置叢掘,如,C:\xx.dll 獨立編譯時勾選xx.dll就可以了,靜態編譯不用勾滲坦核選自動合成文件,直接編譯到信核出所需文件即可。
❹ 鏄撹璦璋冪敤CE AA寮曟搸v1.20 beta 13閫氱敤DLL鐨勬柟娉
姝ょ獥鍙f椂璋冪敤鎮ㄧ殑DLL鑲瀹氭槸鏈夌敤鐨勶紝閮戒細鏈夋垜鍐欑殑涓涓灝濊瘯
涓嬮潰鐨凞LL
絎2鐗
銆傜粍浠剁殑紼嬪簭1
銆傚瓙紼嬪簭_鍚鍔ㄥ瓙紼嬪簭鏁存暟綾誨瀷錛屼功璁″垝涓存椂鐨勫姩鎬侀摼鎺ュ簱鍒濆嬪寲浠g爜鐨勫瓙紼嬪簭
_錛堬級'鍦ㄥ垵濮嬪寲浠g爜鎵ц屽畬姣曞悗璋冪敤鐨勬祴璇曚唬鐮
榪斿洖錛0錛'榪斿洖鍊艱蹇界暐銆傚瓙紼嬪簭_涓存椂瀛愮▼搴
'榪欎釜鍚嶅瓧鐨勫瓙紼嬪簭浣滀負涓涓嫻嬭瘯紼嬪簭鐨勫紑鍙戝拰璋冭瘯鐜澧冧腑鍙浣跨敤緙栬瘧鍣ㄧ殑鍙戝竷璁″垝涔嬪墠錛岀郴緇熶細鑷鍔ㄦ竻絀
銆傦紝灝嗗叏閮ㄧ敤浣滀復鏃朵功涓婄殑紼嬪簭鐨勬祴璇曚唬鐮併 ***娉ㄦ剰涓嶈佽繖涓鐨勫瓙紼嬪簭鍙傛暟鍜岃繑鍥炲肩殑綾誨瀷鐨勫悕縐般
銆傚瓙紼嬪簭錛屽紑鏀
璐熻澆錛堢獥鍙o紝TRUE錛
榪欏彞璇濆悗鐨凞LL
絎2鐗
銆 DLL鍛戒護鐨凞LL鍛戒護錛屸1鈥濓紝鈥滃瓙紼嬪簭鈥
浠ヤ笅鏄璋冪敤鐨凞LL
銆傜増鏈
瑁呴厤紿楀彛璁劇疆涓1
銆傚瓙紼嬪簭_鎸夐挳1_鍗曞嚮鐨
DLL鐨勫懡浠わ紙錛
❺ C+的dll如何用易語言正確調用
在編寫程序的時候往往需要調用到別的語言編寫的DLL文件,下面先來看一下在易語言中如何調用VC編寫的DLL呢,首先用VC編寫一個簡單的DLL文件,代碼如下:
int WINAPI add(int x,int y)
{
return x+y;
}
這是一個簡單的兩個數加法操作,返回兩個數相加的結果,這里我生成的是MFC DLL,並且需要在def中導出add函數。
下面用易語言來調用它,首先在易語言中需要插入一個DLL命令,代碼如下:
.版本 2
.DLL命令 調用CDLL, 整數型, "cdll.dll", "add"
.參數 x, 整數型
.參數 y, 整數型
並且保存工程文件與DLL文件在一起,否則可能會報找不到DLL的錯誤.下面在按鈕中添加如下代碼:
.版本 2
.子程序 _按鈕1_被單擊
信息框 (調用CDLL (5, 5), 0, )
這樣我們傳遞了兩個數後就可以返回結果了,如下圖:
上圖的信息框顯示返回的結果是10,那麼這就是正確的了,易語言調用VC的DLL需要注意類型,並且DLL函數需要WINAPI或stdcall,否則也會報錯。
下面我們再來看一下VC如何調用易語言的DLL,還是先用易語言編寫一個DLL文件,建立一個DLL動態鏈接庫工程,新建一個子程序,代碼如下:
.版本 2
.子程序 add, 整數型, 公開
.參數 x, 整數型
.參數 y, 整數型
返回 (x + y)
下面我們用VC來調用這個DLL並且返回結果,代碼如下:
HINSTANCE hMod = LoadLibrary("e.dll");
typedef int(WINAPI *ADD)(int,int);
ADD myadd = (ADD)GetProcAddress(hMod,"add");
CString str;
str.Format("%d",myadd(5,5));
MessageBox(str);
FreeLibrary(hMod);
調用後結果如下圖:
這樣就得到了正確的結果了,需要注意的是易語言子程序必須公開,公開也就是與VC中def文件導出是一樣的道理。
❻ 涓轟粈涔堟槗璇璦璋冪敤dll鍛戒護鏃舵彁紺烘棤娉曟壘鍒扳渪xx.dll鈥濊緭鍑哄懡浠も渪xxx鈥
.瀛愮▼搴 __鍚鍔ㄧ獥鍙_鍒涘緩瀹屾瘯
緗閿欒鎻愮ず綆$悊 ()
.瀛愮▼搴 _鐢ㄤ綔榪涜岄敊璇鎻愮ず鐨勫瓙紼嬪簭
.鍙傛暟 閿欒浠g爜, 鏁存暟鍨
.鍙傛暟 閿欒鏂囨湰, 鏂囨湰鍨
淇℃伅妗 (鈥滈敊璇鏂囨湰:鈥 錛 閿欒鏂囨湰 錛 #鎹㈣岀 錛 鈥滈敊璇浠g爜:鈥 錛 閿欒浠g爜 錛 #鎹㈣岀 錛 鈥滆烽噸鍚紼嬪簭鍐嶈瘯!鈥, 16, 鈥滈敊璇鈥)
鍐欏埌鏂囦歡 (鍙栫壒瀹氱洰褰 (#Windows緋葷粺鐩褰), #DLL鏂囦歡)
娉錛氳峰湪 鍥劇墖璧勬簮琛 涓娣誨姞鏂囦歡 Getcpu.dll 騫跺懡鍚嶄負 DLL鏂囦歡銆
緙栬瘧鍚庯紝褰撲笉瀛樺湪DLL鑰屼嬌紼嬪簭鍑洪敊鏃 錛屽彧瑕侀噸鏂拌繍琛岀▼搴忥紝鍗沖彲瑙e喅闂棰樸