DELPHI调用C++开发的DLL问题

小发猫 2009-12-02 03:57:43
我用MS VISULA C++6.0写了个DLL,在C++下调用是成功的,在DELPHI下调用就出错了(如图1)。代码如下,不知什么问题,高人请指点,必酬重分。注:本人不会DELPHI。

函数C++定义如下:
typedef int (*FreeEIM)(char *szDest, char *szMessage);

C++下可以以轻松调用,C++ 示例如下:(执行成功,无任何错误)。
#include "stdafx.h"
#include <windows.h>

typedef int (*FreeEIM)(char *szDest, char *szMessage);
int main(int argc, char* argv[])
{
HINSTANCE hInst = LoadLibrary("feimt.dll");
if (NULL != hInst)
{
printf("Library loaded.\r\n");
FreeEIM freeeim;
freeeim = (FreeEIM)GetProcAddress(hInst,"FreeEIM");
if (freeeim)
{
printf("Load ok.\r\n");
freeeim("127.0.0.1", "hello.");
}
}
return 0;
}

以下是DELPHI的调用,不知哪里出错,请看看:
图一:


unit Unit1;

interface

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

type



//////////// 这里是函数定义吧?

TMB = function(szDest, szMessage: string ): Integer; stdcall;






////////////


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

var
Form1: TForm1;



//MB 函数的声明:
function MB( szDest, szMessage :string): Integer; stdcall;


implementation

{$R *.dfm}
function MB; external 'feimt.dll' name 'FreeEIM'

procedure TForm1.Button1Click(Sender: TObject);
begin
mb('127.0.0.1','hello.');
end;

end.


请帮忙解决,谢谢!
...全文
120 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
阳阳2013哈哈 2009-12-02
  • 打赏
  • 举报
回复
1、保证你传递的参数要正确:C++中的char *对应PASCAL中的pchar。
2:C++中导出的函数的参数调用方式要和你DELPHI中的导入的函数参数调用方式要一致!
例如: C++的参数调用方式 对应的DELPHI的参数调用方式
_declspec cdecl
WINAPI,CALLBACK stdcall
PASCAL pascal
我遇到过你同样的问题,后来把STDCALL改为cdecl,问题就解决了,因为我在C++导出函数时使用的是“_declspec(dllexport)”,也就是C参数调用格式。
yumenyoudian 2009-12-02
  • 打赏
  • 举报
回复
应该是调用约定的问题。C++默认的调用约定是cdcel,你在delphi声明的时候用的cdcel当然会出问题了。
有2中修改方式:
1、C++导出函数声明为stdcall
2、在delphi声明中用cdcel调用约定
bdmh 2009-12-02
  • 打赏
  • 举报
回复
string 改为pchar试试

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧