菜鸟发问,各位大侠不吝赐教!!!(100分)(100分)

  • 主题发起人 主题发起人 chinaboylqj
  • 开始时间 开始时间
C

chinaboylqj

Unregistered / Unconfirmed
GUEST, unregistred user!
刚学delphi发现其功能特别强大,
以前学的c++在图形图象处理方面有突出的优点
由此想到用两者混合编程
请各位大侠指点迷津告诉小弟如何实现两者混编?
若给出实例再给50分
 
用DLL技术吧,相完全结合不太容易,不过DELPHI在图形处理上功能也很强大呀;
看看TEECHART就知道了,因为DELPHI对API的封装堪称完美;
 
用Interface接口吧,反正所有程序通用!
也可以用com对象。
 
能不能给出具体例子呢?
谢谢!!!
 
是不是太简单,没人回答?
帮帮菜鸟吧
 
用Dll可以很完美的结合起来.我就这样做的,感觉不错哦!下面是别人的帖子,我看人家已经写的够详细的了我就不再写了.

在不同的开发环境中为实现一些功能相同的过程,由于开发所使用的设计语言不同,因而不得不编写许多类似的代码,甚至有时要在同一个开发环境不同项目中重写代码,这就造成了很大的资源浪费。动态链接库能较好的解决这个问题,重复利用代码将大大提高了开发效率。一般,用户在应用程序中基于如下要求创建和使用DLL:
1. 在不同的可执行文件之间共享的程序;
2. 在设计应用程序时,将其拆分成各个相互独立功能部件,为以后这些功能部件各自升级提供方便的途径。
动态链接库将共享程序或功能部件做成库中的函数,形成DLL文件,其它应用程序通过使用DLL调用这些函数。在这里将对Delphi和VC中创建和使用动态链接库的方法做一介绍。Delphi和VC定义的动态链接库均可在两者的开发环境中使用。
一、 用Delphi创建DLL
Delphi的DLL创建并不复杂,下面向大家介绍Delphi的DLL创建方法。
(1)首先创建一个新的DLL项目(NewProject)project1,文件头部为:
library Project1;
(2)USES语句后面加入ExPorts语句,指明调用DLL的函数名,形式为:
exports
  checkpwd name 'checkpwd';
(3)在DLL的Pas文件中Type......End后加入该DLL的函数或过程的声明,形式如下:
FunctionName(argment):Boolean;export;
该函数也可以存在于另一个pas文件中(如Unit1.pas),此时只需在项目文件中加入:
uses
  Unit1 in 'Unit1.pas' {Form1};
值得注意的是,该函数或过程应加入窗体的Create和Free(产生和释放)方法。
(4)对项目进行编译即形成DLL文件,可被其它项目调用。
二、Delphi中DLL的调用
调用DLL有两种方法,一种是在应用程序装载时调用,另一种是在应用程序运行时调用。
(1) 装载时调用DLL
在调用DLL的Pas文件中,对DLL函数进行外部声明,声明应位于Implementation后,形式如下:
Implementation
  Function functionname(argment):Boolean;far;External 'DllName';
其中External关键字后面的引号内是DLL的文件名,该文件一般应放在系统的system目录下,或与调用它的项目同一目录。声明以后即可在Pas文件任何地方引用DLL函数。
装载时调用DLL的优点是速度较快,程序间也可共享代码。
(2) 运行时调用DLL
DLL的另一种调用方法是在运行时调用。这种方法要调用到Windows的API函数LoadLibrary,GetProcAddress,FreeLibrary等。此方法主要用于调用其它语言,特别是C++编译的DLL。
假定你欲调用的DLL中包括一个函数:
Function checkpwd(pwd:string):boolean;export;
那么,首先在欲调用DLL的程序Type类型声明处加入一句:
Type
  Tcheckpwd= function(pwd:string):boolean;
此句的作用如同C++中声明的函数指针。
然后定义如下变量∶
Var
  aptr:TFarproc;
  lhnd:THandle;
  flag:boolean;
其中Aptr,lhnd两变量声明必须有,flag是DLL函数返回值,视情况而定。在调用DLL处加入如下语句进行DLL装载:
lhnd:=Loadlibrary('路径:DLL文件名');{如lhnd:=Loadlibrary('c:/project1.dll');
  aptr:=GetprocAddress(lhnd,'checkpwd');
下面可直接调用DLL了:
flag:=Tcheckpwd(aptr)( 'pwd');{根据函数填相应的变量参数}
调用完以后,用FreeLibrary释放DLL占用的内存:
FreeLibrary(lhnd);
三、用VC创建DLL
在VC中创建DLL,与Delphi中的创建过程相似,步骤如下:
(1)新建一个DLL项目。MFC提供两种类型的动态链接库:常规型DLL、扩展型DLL。其中,常规型DLL适合于非MFC开发环境下采用支持DLL调用的程序设计语言开发的应用程序,扩展型DLL只能被MFC程序使用。
(2)创建该DLL中的过程或函数,只需在程序中加入下列语句:
extern "C" _declspec(dllexport)
  int yanzheng(CString input,char* zcm)
  {
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  file://具体实现过程
  }
该函数的功能是验证注册码是否合法,其中yanzheng为函数名,int为函数返回值类型,()内为函数参数。编译通过后即可使用。
四、 VC中DLL的调用
在VC中调用动态链接库时,类似于Delphi中运行时调用DLL的方法。也要调用到Windows的API函数LoadLibrary,GetProcAddress等。此方法对于调用其它语言和VC编译的DLL均适用。
假定DLL中包括一个函数:
int yanzheng(CString input,char* zcm)
首先在欲调用DLL函数的cpp文件前部先声明函数指针,定义函数类型:
typedef int (* _YANZHENG)(CString,char* zcm);
然后定义如下变量∶
HINSTANCE hLibrary;
  _YANZHENG yanzheng;
在调用DLL处加入如下语句进行DLL装载:
hLibrary=LoadLibrary("zcdll.dll");
  yanzheng=(_YANZHENG)GetProcAddress(hLibrary,"yanzheng");
  shuchu= (*yanzheng)(shuru,zcm);
  FreeLibrary(hLibrary);
五、 几点提示
(1)如果用Delphi创建DLL时用到其它的form,则在DLL的输出函数中应包括form的create(创建)和free(释放),而且在显示该窗口时只能用showmodal过程,不能用show过程,在后面的例子中能详细看到。
(2)如果Delphi创建的DLL中的函数或过程,用string类型作为参数输入或返回string类型,当用VC或其它程序调用时,经常会出错,反之亦然。为了解决这种情况,使不同程序之间在使用字符串类型时,接口更安全,建议使用pchar类型,而不是string类型。而且要在程序中加入内存管理,使用系统提供的sharemem单元。下面是一个实现将星期标识由数字转换成英文的例子:
uses
  sharemem;
  exports
  makeitaday;
  var
  mydate:pchar;
  function makeitaday(S:integer):pchar;stdcall;export;
  implementation
  function makeitaday(S:integer):pchar;stdcall;export;
  var
  thedate:array[0..20] of char;
  begin
  GetMem(mydate, 200);
  if s=1 then
thedate:='Sunday ';
  file://……….
  strpcopy(mydate,thedate);
  makeitaday:=mydate;
  end;

六、实例
因为用Delphi创建和调用DLL,过程与用VC创建和调用DLL相似,只是前者代码要比在VC环境中稍微复杂一些,因此在文章的最后给出一个完整的用Delphi创建和调用DLL的例子。该DLL主要用来检查输入的口令是否正确,窗体含有一个Edit编辑框,一个按钮Button,在编辑框内输入口令,比较编辑框的值和输入参数返回真假值。
//文件名为checkpassword.dpr;编译此文件生成checkpassword.dll
  library checkpassword;
  uses
  SysUtils, Classes, Unit1 in 'Unit1.pas' {Form1};
  exports
  checkpwd name 'checkpwd';//声明DLL函数
  {$R *.RES}
  begin
  end.
file://文件名为unit1.pas
  unit Unit1;
  interface
  uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
  type
  TForm1 = class(TForm)
  password: TEdit;
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end;
  var
  Form1: TForm1;
  flag:boolean;//返回输入密码是否正确
  rightpwd:string;//记录输入参数(正确的密码)
  function checkpwd(pwd:string):boolean;export;//声明DLL函数
  implementation
  {$R *.DFM}
  procedure TForm1.Button1Click(Sender: TObject);
  begin
  if password.text=rightpwd then
  flag:=true;
  form1.close;
  end;
function checkpwd(pwd:string):boolean;export;
  begin
  flag:=false;
  rightpwd:=pwd;//读入正确的密码值
  form1:=Tform1.create(Application);//创建密码验证窗口
  form1.ShowModal;//显示窗口
  checkpwd:=flag;
  form1.free;//释放资源
  end;
  end.
file://主程序main.pas,调用DLL
  unit main;
  interface
  uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
  type
  TForm1 = class(TForm)
  jieguo: TEdit;
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
   public
  { Public declarations }
  end;
  var
  Form1: TForm1;
  implementation
  function checkpwd(pwd:string):boolean;external 'project1.dll' ;//函数说明
  {$R *.DFM}
  procedure TForm1.Button1Click(Sender: TObject);
  begin
  if checkpwd('congrong') then
//调用函数
  jieguo.text:='true'
  else
  jieguo.text:='false';
  end;
  end.

以上程序在Windows98/Delphi6下编译通过。


 
当然你也可以在Delphi中编写OCX控件然后再在VC,VB或PB上也能轻松调用.不过要把这贴结了后告知!
 
嘿嘿,
多谢!
等待接分吧
OCX控件是什么
回答之后立即给分
 
你也可以到这里来,看看人家做的东西,全部提供源码,不收费,有兴趣的话也可以参与
http://asp.6to23.com/iseesoft/
 
后退
顶部