用VC++编写的DLL文件在DELPHI是否都能够调用? 用VC++编写的DLL文件在DELPHI是否都能够调用? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般都能够调用,但是要注意: 1、VC++的函数名是大小写敏感的,在Delphi引入时要注意; 2、调用方式,VC++自己缺省为C方式,对应Delphi的“Cdel”,最好都用StdCall; 3、参数对应关系,如*对应指针,&对应Var等。 4、如果VC++输出的是个类,则Delphi也能够调用,可以采用包装法,但是,最好采用虚拟表法。 5、我曾回答FigoZhu(朱德飞)的一个问题“Delphi可以使用VC做的DLL还原的LIB吗?”讲过类似问题,你可以去看一看。(2003-9-8 21:27:20发布,已结贴)。 以下给你一个例子,你可以借鉴以下,这是从一个已经完全调通的程序在录下来的。 希望对你有帮助。 ----------------------------------------------------------------------------- VC++的定义: // MYProcess.cpp: 一定是 .CPP文件!! #include "stdafx.h" #include "myProcess.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif extern "C" __declspec(dllexport) DWORD CDWORDProcess() { return .......; } extern "C" __declspec(dllexport) BOOL CBOOLProcess() { CASmoothProcess* pASmoothProcess = new CASmoothProcess; return ......; } extern "C" __declspec(dllexport) void CvoidProcess() { return; } 以下是Delphi的引入单元: unit MYUnit; {$ALIGN ON} {$MINENUMSIZE 1} interface Uses Windows,SysUtils; Type TCDWORDProcess=Function(...) Dword; Cdecl; //注意与VC++中对应函数的参数说明一致 TCBOOLProcess=Function(...) Bool;Cdecl; //注意参数次序、类型对应 TCvoidProcess=Procedure(...);Cdecl; //对应“过程” implementation Var CDWORDProcess: TCDWORDProcess; CBOOLProcess: TCBOOLProcess; CvoidProcess: TCvoidProcess; Var DLL_Handle: THandle; Function LoadDLL: Bool; //动态连接库加载 Var Loadok: Bool; //动态连接库加载路径 SysDLLPath: String; Begin Loadok:=True; LoadDLLsOk:=False; SysDLLPath:=.... //DLL所在的目录; DLL_Handle:=LoadLibrary(PChar(SysDLLPath)); //安给定的路径加载 If DLL_Handle>0 Then //若加载成功, Begin //则依次定位三个函数 Try LoadDLLsOk:=True; @CDWORDProcess:=GetProcAddress(DLL_Handle,'CDWORDProcess');//致意注意大小写! @CBOOLProcess:=GetProcAddress(DLL_Handle,'CBOOLProcess'); @CvoidProcess:=GetProcAddress(DLL_Handle,'CvoidProcess'); Except FreeLibrary(DLL_Handle); Loadok:=False; End End Else Loadok:=False; Result:=Loadok; End; initialization //初始化处理 LoadSmooths; finalization If DLL_Handle>0 Then //退出处理 FreeLibrary(DLL_Handle); end. ----------------------------------------------------------------- 对不起,有一个错误:initialization //初始化处理 LoadDLL; //不是LoadSmooths; 调用DLL注意以下几个问题:1、调用方式,2、参数类型, 可以的,我都知道怎样做不好意思, 借你的地方用一下,delphi高手们,你们好!我是一位delphi初学者, 希望各位指点小弟一下, 小弟在此谢过啦, 小弟的邮箱是: [email protected] 新人求教 deLphi里有没自带 日历转阴历的函数 返回TADOQuery的结果 adoquery的问题 在DBgrid中怎么样设置某一个列的数据可修在并可以提交到数据库的表里边 query 的查询使用 如何使用UDP实现无错数据传输 bcb里的 char *在delphi是什么类型? 请教!如何根据姓名的每一个字的第一个字母来查询? 我是初学者!初来咋道,请各位多关照! 怎样为系统托盘内的小图标加右击快捷菜单 领分处3——ronaldli(木的) 请来领分,并感谢你的帮助! 訪問SQL Server數據庫使用ADO快還是dbExpress快呢,
1、VC++的函数名是大小写敏感的,在Delphi引入时要注意;
2、调用方式,VC++自己缺省为C方式,对应Delphi的“Cdel”,最好都用StdCall;
3、参数对应关系,如*对应指针,&对应Var等。
4、如果VC++输出的是个类,则Delphi也能够调用,可以采用包装法,但是,最好采用虚拟表法。
5、我曾回答FigoZhu(朱德飞)的一个问题“Delphi可以使用VC做的DLL还原的LIB吗?”讲过类似问题,你可以去看一看。(2003-9-8 21:27:20发布,已结贴)。
#include "myProcess.h" #ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif extern "C" __declspec(dllexport) DWORD CDWORDProcess()
{
return .......;
}
extern "C" __declspec(dllexport) BOOL CBOOLProcess()
{
CASmoothProcess* pASmoothProcess = new CASmoothProcess;
return ......;
} extern "C" __declspec(dllexport) void CvoidProcess()
{
return;
} 以下是Delphi的引入单元:
unit MYUnit; {$ALIGN ON}
{$MINENUMSIZE 1} interface Uses Windows,SysUtils; Type TCDWORDProcess=Function(...) Dword; Cdecl; //注意与VC++中对应函数的参数说明一致
TCBOOLProcess=Function(...) Bool;Cdecl; //注意参数次序、类型对应
TCvoidProcess=Procedure(...);Cdecl; //对应“过程” implementation Var CDWORDProcess: TCDWORDProcess;
CBOOLProcess: TCBOOLProcess;
CvoidProcess: TCvoidProcess; Var DLL_Handle: THandle; Function LoadDLL: Bool; //动态连接库加载
Var Loadok: Bool; //动态连接库加载路径
SysDLLPath: String;
Begin
Loadok:=True;
LoadDLLsOk:=False;
SysDLLPath:=.... //DLL所在的目录;
DLL_Handle:=LoadLibrary(PChar(SysDLLPath)); //安给定的路径加载
If DLL_Handle>0 Then //若加载成功,
Begin //则依次定位三个函数
Try
LoadDLLsOk:=True;
@CDWORDProcess:=GetProcAddress(DLL_Handle,'CDWORDProcess');//致意注意大小写!
@CBOOLProcess:=GetProcAddress(DLL_Handle,'CBOOLProcess');
@CvoidProcess:=GetProcAddress(DLL_Handle,'CvoidProcess');
Except
FreeLibrary(DLL_Handle);
Loadok:=False;
End
End
Else
Loadok:=False;
Result:=Loadok;
End; initialization //初始化处理
LoadSmooths;
finalization
If DLL_Handle>0 Then //退出处理
FreeLibrary(DLL_Handle); end.
-----------------------------------------------------------------
initialization //初始化处理
LoadDLL; //不是LoadSmooths;
1、调用方式,
2、参数类型,
我都知道怎样做
不好意思, 借你的地方用一下,delphi高手们,你们好!我是一位delphi初学者, 希望各位指点小弟一下,
小弟在此谢过啦,
小弟的邮箱是: [email protected]