當前位置:首頁 » 編程語言 » 易語言調用c

易語言調用c

發布時間: 2022-08-08 19:08:53

A. 易語言調用c語言的dll堆棧錯誤!

調用方式是不是一樣?易語言裡面如果有能設置的話,把函數的調用方式設置成Cdecl或者
C語言方式
之類之類……沒用過易語言不知道怎麼設。不過多半是這個問題
實在找不到設置的地方的話,C語言代碼改改,
int
add(int
a,int
b)
改成
int
__stdcall
add(int
a,int
b)

B. 易語言調用C語言寫的dll問題

你用
__declspec
(dllexport)
來寫DLL函數頭的話這個DLL只能被C或C++調用
將函數寫到
.DEF
文件的話可以讓所有編程語言都能調用

C. 易語言怎麼調用c語言的編譯器啊gcc編譯器或cl的都行 怎麼調用啊,代碼是什麼 謝謝 本人急需

gcc和cl的命令行參數都是能查到的,不過具體參數要看用的程序版本。
打開命令提示符 拖入gcc或cl程序 然後輸入" /?"就可以看到的。

D. 在易語言當中,可不可以使用C語言的函數或者一段代碼來實現某個功能呢。。。

可以,有排序函數,復制字元串函數,等等

E. 問下大家:易語言調用GCC編譯C代碼的指令

運行("gcc a.c -o a.exe")

F. 易語言中的調用子程序怎麼通過C語言實現

你在C語言的函數 和易語言的子程序是一樣


main()
{
inta,b,c;
scanf("%d".&a);
scanf("%d".&b);
c=add(a,b);
printf("%d+%d=%d ",a,b,c)
}
intadd(inta,intb)
{
returna+b;
}

G. 易語言怎麼調用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

以便您對此更加了解。

H. 易語言如何調用C語言載入的Dll---請高手指點。

在易語言的左邊功能選項找---程序---dl命令--右鍵---插入新dll命令 DLL命令名=你給他的名稱(在窗口程序下可直接代碼輸入) DLL庫文件名=你調用那個DLL命名 DDL庫中的對應名=在被調用的DLL的子程序完了後直接在窗口下輸入代碼(DLL命令名) 打包的時候將DLL放置包下(可減少錯誤率)

I. 易語言調用C語言編寫的動態鏈接庫中 scanf函數出了問題

大哥,C/C++要來個主函數main(),還有scanf是stdio.h里的一個庫函數,要調用它就需要在前面加上#include<stdio.h>

J. 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文件導出是一樣的道理。

熱點內容
微信在安卓手機的哪個文件夾 發布:2025-01-21 18:43:52 瀏覽:51
sql127001 發布:2025-01-21 18:31:50 瀏覽:112
伺服器ip是什麼格式 發布:2025-01-21 18:13:13 瀏覽:706
oa和郵箱的初始密碼在哪裡改 發布:2025-01-21 18:08:46 瀏覽:52
如何去除pdf的加密 發布:2025-01-21 18:08:46 瀏覽:565
雲端的伺服器怎麼設置ip 發布:2025-01-21 17:48:52 瀏覽:186
會議腳本 發布:2025-01-21 17:41:29 瀏覽:23
android的toast 發布:2025-01-21 17:41:28 瀏覽:9
linux默認安裝的mysql 發布:2025-01-21 17:40:08 瀏覽:912
java輸出資料庫 發布:2025-01-21 17:35:38 瀏覽:963