易语言调用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
以便您对此更加了解。