我在 c++ 中定义了并实现了如下的对象接口,即一个纯虚类typedef void (__stdcall *CRasEvent)(
int RasHandle, //拨号的唯一识别码
int RasError, //出错是的错误代码;0是正确,其他是出错
int RasState); //拨号的状态代码;
//注意值为 RAS_CONNECTED 是指拨号连接成功,class IRasDial
{
public: //进行拨号
virtual int __stdcall Dial(
char *PhoneNumber, //需拨的号码
char *UserName, //拨号时的用户名
char *Password, //拨号时的用户名密码
int NotifierType, //拨号信息的返回方式,
//0是指同步调用,
//1是指异步调用,通过Notifier的函数地址,其中Notifier具体为CRasEvent,
//0xffffffff 异步调用,通过Notifier的句柄发送USER_RASDIALEVENT消息,wParam 是拨号状态,lParam是错误代码
void *Notifier, //拨号时的状态和错误信息的回调函数地址
int &RasHandle)=0; //该拨号的一个唯一识别码};#ifdef _DIALERDLL
#define EXTERN __declspec(dllexport)
#else
#define EXTERN __declspec(dllimport)
#endifextern "C"
{
EXTERN IRasDial * __stdcall CreateRasDial();
}我想在 delphi 中共享此接口,我该怎么做?
int RasHandle, //拨号的唯一识别码
int RasError, //出错是的错误代码;0是正确,其他是出错
int RasState); //拨号的状态代码;
//注意值为 RAS_CONNECTED 是指拨号连接成功,class IRasDial
{
public: //进行拨号
virtual int __stdcall Dial(
char *PhoneNumber, //需拨的号码
char *UserName, //拨号时的用户名
char *Password, //拨号时的用户名密码
int NotifierType, //拨号信息的返回方式,
//0是指同步调用,
//1是指异步调用,通过Notifier的函数地址,其中Notifier具体为CRasEvent,
//0xffffffff 异步调用,通过Notifier的句柄发送USER_RASDIALEVENT消息,wParam 是拨号状态,lParam是错误代码
void *Notifier, //拨号时的状态和错误信息的回调函数地址
int &RasHandle)=0; //该拨号的一个唯一识别码};#ifdef _DIALERDLL
#define EXTERN __declspec(dllexport)
#else
#define EXTERN __declspec(dllimport)
#endifextern "C"
{
EXTERN IRasDial * __stdcall CreateRasDial();
}我想在 delphi 中共享此接口,我该怎么做?
解决方案 »
- 各位老师: 用delphi7写菜单时,也做工具栏但是.....
- 一个程序设置了俩窗体 form1(主)form2(次),form1最小化,form2也最小化了,怎么让form2没反映?
- 数据库'备份/恢复'碰到的问题,敬请高手指教,先谢啦!
- 超难的问题!!!!! 如何实现这样的拖出连接线功能(多图)!!!!!!!!!!!!!!!!!!
- SQL问题,高分寻高手!快来看看哦!!!!!
- RichEdit(或Memo)的换行显示问题
- 谁有Delphi的编码规范?请发一份给我,一定给分
- delphi程序员的工资有多少?与其他vb或c++以及java程序员相比较谁最高?
- 怎么安装interbase server
- 请问哪里有Delphi方面的书籍下载?
- 能不能用maskedit来限制小数输入啊,比如格式为0.111,该怎么控制这个格式
- 如何在delphi中检测网上某IP电脑FTP端口是否开放的?
// 为方便研究,我另写了一个测试用的类ITest
// delphi中的声明
const VMTTest = 'G:\PROJECTS\VMTTest\Debug\VMTTest.dll';
type
ITest = class
public
procedure HelloWorld; virtual; stdcall; abstract;
end; TCreateTest = function: ITest; stdcall;procedure TForm1.Button1Click(Sender: TObject);
var I: ITest;
var H: THandle;
var CreateTest: TCreateTest;
begin
H := LoadLibrary(VMTTest);
@CreateTest := GetProcAddress(H, '_CreateTest@0');
if @CreateTest <> nil then
begin
I := CreateTest;
if I <> nil then
I.HelloWorld
else
Caption := 'nil';
end
else
Caption := 'fail';
FreeLibrary(H);
end;//vc中的声明
class ITest{
public:
virtual void __stdcall HelloWorld(){
MessageBox(0, "Hello, World", "Test", 0);
};
// TODO: add your methods here.
};extern "C" _declspec(dllexport) ITest * __stdcall CreateTest()
{
return new ITest();
};// 说明:我在d5及vc6下运行正常。
// 不过vc中创建的对象直接拿到d中使用,释放可能是个问题,
// 我继续研究看看。
// 你的问题很有趣,谢谢。
你帮了我的大忙。关于释放,你可以在ITest中再增加一个函数 free(){ delete this;} 来进行释放。其实我以前在bcb6 和 vc6下实现过,但不知道delphi怎么实现,再次谢谢你。