导航
  • 主页
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

用Delphi 5 调用 VC++ 6 的dll类中的函数出现问题(Access Violation)

boodweb 2001-03-24 12:02:00
Delphi 代码:
unit Unit1;

interface

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

...

type
TSample=class(TObject)
public
function ok():Boolean;virtual;cdecl;abstract;
end;

type
pTSample=^TSample;

var
Form1: TForm1;
pSample:pTSample;
function CreateInstance():pTSample;cdecl;far;external 'httpdll';
procedure DeleteInstance(psample:pTSample);cdecl;far;external 'httpdll';


implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
pSample:=CreateInstance();
pSample^.ok(); //调用时出现"Access Violation at..."对话框
DeleteInstance(pSample);
end;

end.


VC++代码:

declaration:
#define DllExport __declspec(dllexport)

extern "C" DllExport sample * __cdecl CreateInstance();
extern "C" DllExport void __cdecl DeleteInstance(sample * Instance);

class DllExport sample
{
public:
virtual BOOL __cdecl ok();
};


definitions:

BOOL __cdecl sample::ok()
{
MessageBox(NULL,"Hello","In Dll",0);
return 1;
}

extern "C" DllExport sample * __cdecl CreateInstance()
{
return (new sample);
}

extern "C" DllExport void __cdecl DeleteInstance(sample * Instance)
{
delete Instance;
}
...全文
107 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
boodweb 2001-03-31
哦!是这样啊,谢谢各位了!
回复
严黎斌 2001-03-29
类可比记录类型要复杂得多了,microsoft vc++的类在底层实现上肯定与borland的不同,不能互相调用的。
borland自己的delphi与c++ builder倒是可以通过dll互相调用、共享类。
回复
whoo 2001-03-29
输出类用于不同语言之间的共享,我想基本上是不可能的.

其中命名规则一条就通不过.因为在类的命名规则上,各个厂家并没有统一,而是各行其是.根本无法沟通.
回复
boodweb 2001-03-29
那一定要输出类在技术上可以实现吗?
回复
whoo 2001-03-27
不要试图输出类,更改一下思维,比如:输出过程...
回复
boodweb 2001-03-27
好象用interface也不行呀!到底怎么回事啊!!!
回复
windoze 2001-03-24
你应该用Interface完成类似的任务,比如:
Delphi程序:
type
ISample=interface
function ok():Boolean; stdcall; // 应该用stdcall
end;
//...
C++程序:
__declspec(novtable) class ISample // equivalent to interface
{
virtual BOOL __cdecl ok()=0;
};

class CSample : public ISample
{
virtual BOOL __stdcall ok();
}

BOOL __stdcall CSample::ok()
{
// ...
}

extern"C"{
DllExport sample * __stdcall CreateInstance();
DllExport void __stdcall DeleteInstance(sample * Instance);
};

ISample * __cdecl CreateInstance()
{
return (new sample);
}

void __cdecl DeleteInstance(ISample * Instance)
{
delete Instance;
}
回复
boodweb 2001-03-24
那你认为C++的类不如Delphi的?还是说两者不可能兼容?
我现在是解决问题,孰好孰坏以后再说,可以说一下哪儿错了吗?
回复
whoo 2001-03-24
问题大大的,C++的类如何和Delphi的类相提并论!!!?
回复
发动态
发帖子
Delphi
创建于2007-08-02

4808

社区成员

Delphi 开发及应用
申请成为版主
社区公告
暂无公告