三九宝宝网宝宝教育教学论文

怎样用DELPHI调用别的语言编写的DLL

12月25日 编辑 39baobao.com

[高手速度来跪求数据结构用C语言编写 1创建链表 L要用到以下函数]以前的实验题。 #define OK 1 #define NULL 0 #define ERROR 2 #define ElemType int #include "iostream.h" #include "stdio.h" #include "stdlib.h" typedef struct LNode { in...+阅读

external 'Delphi.dll';procedure TForm1.Button1Click(Sender: TObject);beginEdit1.Text:=IntToStr(TestDll(1)); end;end.上面的例子中我们在窗体上放置了一个编辑框(Edit)和一个按钮(Button),并且书写了很少的代码来测试我们刚刚编写的Delphi.dll。大家可以看到我们唯一做的工作是将TestDll函数的说明部分放在了implementation中,并且用external语句指定了Delphi.dll的位置。(本例中调用程序和Delphi.dll在同一个目录中。)让人兴奋的是,我们自己编写的TestDll函数很快被Delphi认出来了。您可做这样一个实验:输入“TestDll(”,很快Delphi就会用fly-by提示条提示您应该输入的参数是什么,就像我们使用Delphi中定义的其他函数一样简单。注意事项有以 下一些:一、调用参数用stdcall。和前面提到的一样,当引用DLL中的函数和过程时也要使用stdcall参数,原因和前面提到的一样。二、用external语句指定被调用的DLL文件的路径和名称。正如大家看到的,我们在external语句中指定了所要调用的DLL文件的名称。没有写路径是因为该DLL文件和调用它的主程序在同一目录下。如果该DLL文件在C:\,则我们可将上面的引用语句写为external 'C:\Delphi.dll'。注意文件的后缀.dll必须写上。三、不能从DLL中调用全局变量。如果我们在DLL中声明了某种全局变量,如:var s:byte 。这样在DLL中s这个全局变量是可以正常使用的,但s不能被调用程序使用,既s不能作为全局变量传递给调用程序。不过在调用程序中声明的变量可以作为参数传递给DLL。四、被调用的DLL必须存在。这一点很重要,使用静态调用方法时要求所调用的DLL文件以及要调用的函数或过程等等必须存在。如果不存在或指定的路径和文件名不正确的话,运行主程序时系统会提示“启动程序时出错”或“找不到*.dll文件”等运行错误。第四章 在Delphi中动态调用DLL top动态调用DLL相对复杂很多,但非常灵活。为了全面的说明该问题,这次我们举一个调用由C++编写的DLL的例子。首先在C++中编译下面的DLL源程序。#includeextern ”C” _declspec(dllexport) int WINAPI TestC(int i){return i;}编译后生成一个DLL文件,在这里我们称该文件为Cpp.dll,该DLL中只有一个返回整数类型的函数TestC。为了方便说明,我们仍然引用上面的调用程序,只是将原来的Button1Click过程中的语句用下面的代码替换掉了。procedure TForm1.Button1Click(Sender: TObject);typeTIntFunc=function(i:integer):integer;stdcall;varTh:Thandle; Tf:TIntFunc; Tp:TFarProc;beginTh:=LoadLibrary('Cpp.dll'); {装载DLL} if Th>0 thentryTp:=GetProcAddress(Th,PChar('TestC'));if Tpnilthen beginTf:=TIntFunc(Tp); Edit1.Text:=IntToStr(Tf(1)); {调用TestC函数}endelseShowMessage('TestC函数没有找到');finallyFreeLibrary(Th); {释放DLL}endelseShowMessage('Cpp.dll没有找到'); end;大家已经看到了,这种动态调用技术很复杂,但只要修改参数,如修改LoadLibrary('Cpp.dll')中的DLL名称为'Delphi.dll'就可动态更改所调用的DLL。一、定义所要调用的函数或过程的类型。在上面的代码中我们定义了一个TIntFunc类型,这是对应我们将要调用的函数TestC的。在其他调用情况下也要做同样的定义工作。并且也要加上stdcall调用参数。二、释放所调用的DLL。我们用LoadLibrary动态的调用了一个DLL,但要记住必须在使用完后手动地用FreeLibrary将该DLL释放掉,否则该DLL将一直占用内存直到您退出Windows或关机为止。现在我们来评价一下两种调用DLL的方法的优缺点。静态方法实现简单,易于掌握并且一般来说稍微快一点,也更加安全可靠一些;但是静态方法不能灵活地在运行时装卸所需的DLL,而是在主程序开始运行时就装载指定的DLL直到程序结束时才释放该DLL,另外只有基于编译器和链接器的系统(如Delphi)才可以使用该方法。动态方法较好地解决了静态方法中存在的不足,可以方便地访问DLL中的函数和过程,甚至一些老版本DLL中新添加的函数或过程;但动态方法难以完全掌握,使用时因为不同的函数或过程要定义很多很复杂的类型和调用方法。对于初学者,笔者建议您使用静态方法,待熟练后再使用动态调用方法。

以下为关联文档:

API函数是用C编写的吗?API和C到底是什么关系API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API 由一个或多个提供某种特殊功能的 DLL 组成。 DLL 是一个文件,其中包含了...

编写c语言二维数组一: #include <stdio.h> void main(){ int i,j; int a[5][3]; for(i=0;i<5;i++) for(j=0;j<3;j++){ scanf("%d",&a[i][j]); } for(i=0;i<5;i++){ for(j=0;j<3;j++){ printf("%d...

用C语言编写二分法解方程程序#include <stdio.h> #include <math.h> float getvalue(float x) { return x*x*x+4*x*x-10; } void main() { float a=1,b=1.5,c; c=(a+b)/2; while(fabs(getvalue(c))>0.00...

用C语言编写一个将若干单词按字母排序的程序请各位高手帮忙//--------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define FILENAME "c:\\a.t...

请教一个关于perl语言中子程序调用的问题#!c:/perl/bin/perl use strict; { sub add { my ($a,$b)=_; my $result=$a+$b; return $result; } add(1,2); } 你看一下我改的代码。 你的代码的错很多,首先 sub add后不应...

Java语言里面如何调用函数请给出一段调用函数的代码public class HelloWord{ //自定义的输出函数,打印字符串helloword! public void printHelloWord() { System.out.println("helloword!"); } public static void main(String a...

C语言调用自身的函数其实是这样的,主调函数会继续执行被调函数之后的语句。 假设第一次执行travel,判断root!=NULL,则会第二次执行travel,此处是travel(root->l);。 第二次执行的travel语句肯定是要...

用C语言编写一个对称加密算法对字符串加密其实关键点就两个, 1、 如何进行对称位交换 (看我代码中的 SYMM_SWAP 宏) 2、 加密时先 对称交换,然后与key异或, 解密时则先与key异或,然后对称交换。 对此代码有什么不懂,可以bai...

请教在DELPHI中如何调用C语言的DLL文件DELPHI可以调用任何语言写的DLL文件,调用的方法例子代码: var psapi: cardinal; //下面申明DLL中子程序的原型 EnumProcesses: function (lpidProcess, cb, cbNeeded: DWORD):...

推荐阅读
图文推荐