请问怎么在Delphi中使用C写的DLL?(200分)

  • 主题发起人 主题发起人 netspur
  • 开始时间 开始时间
N

netspur

Unregistered / Unconfirmed
GUEST, unregistred user!
例如有个C函数写成DLL:
int addone(int i)
{
return ++i;
}

在delphi中怎么声明呢?在这个DLL又怎么声明呢?
我在delphi中试过用“external”和“loadlibrary”两种方法,程序可以运行。
但是在执行addone(8)的时候,却返回一个很大的整数,为什么?
 
有可能你需要在delphi中的函数声明中加上stdcall,因为C++的函数调用与Delphi的不同。
 
in c declare
#ifdef __c_plusplus__
extern "C"
#endif
int __stdcall addone(int i)
{
return ++i;
}


In delphi,try
external addone(integer x):integer;stdcall;
 
to duz

还是不行,如果加入__stdcall,程序会提示非法操作
 
for example:
定义:

<b>implementation</b>
function PlusNum(X,Y:Integer):Integer;stdcall;external 'DLL1/Project1.dll';
function MinusNum(X,Y:Integer):Integer;stdcall;external 'DLL1/Project1.dll';
function MultiplyNum(X,Y:Integer):Integer;stdcall;external 'DLL2/Project2.dll';
<b>end</b>;
使用:
添加B u t t o n 1组件的O n C l i c k事件的处理过程如下:
procedure TForm1.Button1Click(Sender: TO b j e c t )
b e g i n
if ComboBox1.Te x t = '两数相加' then
E d i t 3 . Te x t : = I n t To S t r ( P l u s N u m ( S t r To I n t ( E d i t 1 . Te x t ) , S t r To I n t ( E d i t 2 . Te x t ) ) )
else if ComboBox1.Te x t = '两数相减' then
E d i t 3 . Te x t : = I n t To S t r ( M i n u s N u m ( S t r To I n t ( E d i t 1 . Te x t ) , S t r To I n t ( E d i t 2 . Te x t ) ) )
else if ComboBox1.Te x t = '两数相乘' then
E d i t 3 . Te x t : = I n t To S t r ( M u l t i p l y N u m ( S t r To I n t ( E d i t 1 . Te x t ) , S t r To I n t ( E d i t 2 . Te x t ) ) )
e l s e
M e s s a g e B o x ( F o r m 1 . H a n d l e , '请指定一个计算方法。' ,
'警告', MB_OK+MB_ICONWA R N I N G )
e n d
 
to 轩辕散光

不行啊,我在delphi也是这么声明的
 
那addone(1)呢
也是同样的问题吗???
 
C的源程序如下:

/*-------------- test.h -------------------*/
#include <windows.h>
#define EXPORT extern "C" __declspec (dllexport)
EXPORT int testfunc(int i);


/*-------------- test.c -------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
#include "test.h"
int testfunc(int i)
{
return ++i;
}


DELPHI的源程序如下:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation


{$R *.DFM}
function testfunc(i:integer):integer;external 'test6.DLL';

procedure TForm1.Button1Click(Sender: TObject);
var k,kk,i:integer;
begin
kk:=99;
k:=testfunc(kk);
label1.Caption:=inttostr(k);

end;

end.


执行程序时,无论kk为什么值,label1总显示“6813441”这个数,真不知道怎么办。
 
看来是你的程序的问题
你好好比较一下我给你的例子
你应该能发现你的错误
 
function testfunc(i:integer):integer;external 'test6.DLL';
改为
function testfunc(i:integer):integer;stdcall;external 'test6.DLL';
应该遵循Win32调用约定
 
楼上说的是。
另c中的定义也应定义成pascal调用.
 
可是一加stdcall就提示程序非法操作啊。
还有就是如何在C里面声明是pascal调用呢?
 
多谢各位大侠指点,我查过help,发现解决办法如下:

function testfunc(i:integer):integer;cdecl;external 'test6.DLL';

原来是加“cdecl”声明。
 
多人接受答案了。
 
后退
顶部