怎样在VC中生成DLL,然后这个DLL可以供delphi

yuexianhanshu 2008-09-10 02:24:04
我需要把C和C++写的工程做成DLL库,然后把这个DLL库给delphi调用,
1、请问怎样生成这个库呢?
2、在生成库的时候,应该注意哪些地方呢?
3、给delphi调用的时候,就给一个.dll文件就行了么?还需要接口文件么?

本人刚接触库,请知道的讲得详细一点
...全文
133 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-09-11
  • 打赏
  • 举报
回复
看看你的函数在两种语言分别是如何定义的。

.h只有C/C++才用。
柯本 2008-09-11
  • 打赏
  • 举报
回复
1.要自己写,DEF的具体定义在MSDN或其它网上都可找到
.h是给C/C++调用时用的,.def是生成.dll时用的,在调用时,delphi不用这两个文件
2.调用时报内存错,可能是以下原因
1).所调.dll不在delphi所在目录或path的目录中
2).调用方式不对(stdcall/cdecl)上面的要写成
function Test(a:integer;b:integer):integer;stdcall;external "t.dll"
yuexianhanshu 2008-09-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cnzdgs 的回复:]
例如:
cpp文件中写:
int __stdcall Test(int a, int b)
{
return a + b;
}
再给项目添加一个def文件,里面写:
LIBRARY "项目名称"
EXPORTS
Test
调用只需要dll文件。
[/Quote]

我用上面的方法生成 .dll和 .def 文件给delphi调用,delphi可以编译,但是调用的时候就会报内存泄漏的错误

还需要把.h 头文件给delphi 么?
内存泄漏 2008-09-10
  • 打赏
  • 举报
回复
在VC++中,如果生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果DLL是提供给VC++用户使用的,只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
__declspec(dllexport) int __stdcall IsWinNT()
会转换为IsWinNT@0,这样你在VB中必须这样声明:
Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long
@的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。

参考:http://blog.chinaunix.net/u/18517/showart_309975.html
柯本 2008-09-10
  • 打赏
  • 举报
回复
1.VC的C标准DLL(用extern "C"导出,且没有类参数或返回值)的,delphi调用没任何问题,只要类型匹配
2.VC的C++ DLL 就复杂了.具体可参考我回过的:
http://topic.csdn.net/t/20060710/15/4871016.html
由于BCB与DELPHI的格式类似(都是borland的),所以,bcb调用vc的方法同样适用与delphi
vc的DLL最好不要用类作参数或返回,C++生成的导出名可由.def文件建别名(参考msdn有关def的定义)
如果VC的DLL的确有类参数或返回,且自己不能修改它(如没源码,是别人写的).最终的方法是再用VC写一个DLL,调用原DLL,而用c标准导出给delphi,(前以回过类似的,暂找不到了.)
有问题可再交流
abomber2 2008-09-10
  • 打赏
  • 举报
回复
还有数据类型 不能是 自定义类

可以是C的结构 和 基本类型
cnzdgs 2008-09-10
  • 打赏
  • 举报
回复
例如:
cpp文件中写:
int __stdcall Test(int a, int b)
{
return a + b;
}
再给项目添加一个def文件,里面写:
LIBRARY "项目名称"
EXPORTS
Test
调用只需要dll文件。
内存泄漏 2008-09-10
  • 打赏
  • 举报
回复
dll函数名前面申明..
yuexianhanshu 2008-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mycool2001 的回复:]
Dll导出接口采用 stdcall 约定就好了,其他的没有什么要注意的!
[/Quote]

怎样采用 stdcall 呢?
mycool2001 2008-09-10
  • 打赏
  • 举报
回复
Dll导出接口采用 stdcall 约定就好了,其他的没有什么要注意的!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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