易语言怎么调用其他语言

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了易语言怎么调用其他语言相关的知识,希望对你有一定的参考价值。

易语言可以调用其他语言。在使用易语言与其他语言配合编程中,有时需要使用易语言的DLL来返回文本型的值,但是由于易语言本身文本型数据不能直接返回让其他语言使用(直接使用多次会崩溃).所以这里要使用一种转换的方式,是其他语言调用易语言的文本返回参数。使用了内存的操作, 在易语言当中,申请一块足够的内存(例程中为1024字节),然后将要返回的文本写到该内存中,然后DLL返回一个内存指针.再在其他语言中读取该指针。调用伪代码:DLL命令 Test1,int adress= Test1();//执行DLL命令,使其返回一个内存指针。所以,易语言可以调用其他语言。 参考技术A 运行 (“C:\1.exe”, 假, )
调用格式: 〈逻辑型〉 运行 (文本型 欲运行的命令行,逻辑型 是否等待程序运行完毕,[整数型 被运行程序窗口显示方式]) - 系统核心支持库->系统处理
英文名称:run
本命令运行指定的可执行文件或者外部命令。如果成功,返回真,否则返回假。本命令为初级命令。
参数<1>的名称为“欲运行的命令行”,类型为“文本型(text)”。
参数<2>的名称为“是否等待程序运行完毕”,类型为“逻辑型(bool)”,初始值为“假”。
参数<3>的名称为“被运行程序窗口显示方式”,类型为“整数型(int)”,可以被省略。参数值可以为以下常量之一:1、#隐藏窗口; 2、#普通激活; 3、#最小化激活; 4、#最大化激活; 5、#普通不激活; 6、#最小化不激活。如果省略本参数,默认为“普通激活”方式。

易语言怎么调用c语言编译器来运行程序代码 ! 急!谢谢回答者!说详细些

  如果易语言编译器容许您,那么就是可以的,例如keilc51编译器和常用调试arm裸机程序,是可以在c语言语句中加入汇编语言。

  由于本人不了解易语言,无法确定其编译器是否可以编译c,但估计是不行。

 

  那么说回来,如果这样,程序就没法写了。实际大家是怎么做的呢。通常做法是将c语言程序编译成dll文件,也就是我们所谓的库文件。然后就可以实现调用了。这种文件我们经常会在常见的程序中看到,原因就是代码保密性好,并且更新很方便,关键在于可以多种语言交互。

  当然了,也可以吧所谓的易语言封装成dll,被c调用,当然如果他有这项功能的话。

 

  如果一个c语言已经编译成可执行程序了,比如exe文件,那么易语言端应与c语言端进行进程通信,方可实现数据交互。那么进程通信就有多种方式,那么就不赘述了。

 

  说下DLL的封装,如果是c语言我们需要加入dll.h

dll.h中放入以下语句

#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

DLLIMPORT void HelloWorld (void);
#include  "func.h"
#endif /* _DLL_H_ */
程序中的,DLLIMPORT void HelloWorld (void);,#include  "func.h"是例子,就是放你书写的用c写的函数声明的地方。
而在你c语言原先放主函数的那个文件中应该写入以下内容
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )

    switch (reason)
    
      case DLL_PROCESS_ATTACH:
        break;
      case DLL_PROCESS_DETACH:
        break;
      case DLL_THREAD_ATTACH:
        break;
      case DLL_THREAD_DETACH:
        break;
    
    /* Returns TRUE on success, FALSE on failure */
    return TRUE;

  我们看见有很多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 __stdcall void GetProgressNumFileIDPackageID(int *PercentNum,int *FileID,int *PackageID);
DLLIMPORT __stdcall int GetInfoNum(int Mode);
DLLIMPORT __stdcall void PutInfoNum(int InfoNum,int Mode);
DLLIMPORT __stdcall void Demo0(void);
DLLIMPORT __stdcall void Demo1(void);
DLLIMPORT __stdcall void InitThreadCriticalSection(void);
DLLIMPORT __stdcall void DeleteThreadCriticalSection(void);

#endif /*_FUNC_H_*/

 

我听说VB和易语言有相似之处那么我给出VB调用C语言DLL时候的函数书写例子,以便您参考。

Public Class Form1
 
    Private Declare Sub NetToWork Lib "Client.dll" (ByVal IpAddr As String, ByVal Port As Integer, ByVal Mode As Integer)

    Private Declare Function StrToStruct Lib "Client.dll" (ByVal Str As String, ByVal Mode As Integer) As Integer

    Private Declare Function StructToStr Lib "Client.dll" (ByVal Str As String, ByVal Mode As Integer) As Integer

    Private Declare Function GetInfoNum Lib "Client.dll" (ByVal Mode As Integer) As Integer

    Private Declare Sub PutInfoNum Lib "Client.dll" (ByVal InfoNum As Integer, ByVal Mode As Integer)

    Private Declare Sub Demo0 Lib "Client.dll" ()

    Private Declare Sub Demo1 Lib "Client.dll" ()

.........

...

..

 

...

    Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
        '从text搜索关键词 并读取回链表数据 
        Dim Str As String
        If (ToolStripTextBox1.Text = "") Then
            MsgBox("内容不能为空")
        Else
            Str = ToolStripTextBox1.Text
            StrToStruct(Str, SEND_SEARCH_0200)
            Dim Th0 As Threading.Thread
            Th0 = New Threading.Thread(AddressOf DownFileList)
            Th0.Start()
        End If
    End Sub

....

..

上程序但中StrToStruct(Str, SEND_SEARCH_0200)就是一个典型的VB调用DLL函数的例子。

 

  那么如果给些相关的参考资料(C语言封装DLL以及VB调用的问题)

    http://www.aidianying123.net/article/?29.html

  以便您对此更加了解。

追问

谢谢

追答

求确认最佳答案。

参考技术A 代码不一样 不可以
就好比你用水杯炒菜
不是一个系统的追问

不是 我已经用易语言把代码转换成c代码了 就是想调用编译器直接运行

以上是关于易语言怎么调用其他语言的主要内容,如果未能解决你的问题,请参考以下文章

易语言怎么读取系统现有的字体列表出来?怎么安装其他字体?用到哪些命令呢?

易语言怎么调用BarTender的COM?

易语言怎么调用zlib的deflate压缩

易语言如何调用DLL文件?

易语言如何调用CryptoJS?

易语言DLL调用