VC做的DLL为何VB调用出错!

yusmt 2008-01-23 10:44:36
我是VC新手,以下的代码为何编译成功,便使用VB调用总是提示“找不到入口点 function in ditectory&filename...”
C++的源代码StdAfx.h
#if !defined(AFX_STDAFX_H__572CA89B_5187_4DD8_B8AD_95750473D389__INCLUDED_)
#define AFX_STDAFX_H__572CA89B_5187_4DD8_B8AD_95750473D389__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#endif // !defined(AFX_STDAFX_H__572CA89B_5187_4DD8_B8AD_95750473D389__INCLUDED_)


#ifdef __cplusplus
extern "C" {
#endif

_declspec(dllexport) _stdcall test(int , char[10] ,char[10] );

#ifdef __cplusplus
} // extern "C"
#endif


C++的源代码*.cpp
#include "stdafx.h"
extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
extern "C" __declspec(dllexport)
int __stdcall test(int ico , char Information[10] ,char Tit[10] )
{
MessageBox(NULL,Information, Tit ,MB_YESNO+ico);
return 0;
}


VB的调用
Declare Function test Lib "bbb.dll" (ByVal ico As Integer, ByVal infor As String, ByVal Tit As String) As Integer
call test(32,“information”,"Title")
...全文
156 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yusmt 2008-01-25
  • 打赏
  • 举报
回复
现在可以了,谢谢tabby
tccqs 2008-01-25
  • 打赏
  • 举报
回复
up and mark,,
内存泄漏 2008-01-25
  • 打赏
  • 举报
回复
这样写:
LIBRARY bbb
EXPORTS
test @1
yusmt 2008-01-25
  • 打赏
  • 举报
回复
为什么我增加了一个def文件后写入以下代码还是无法改变函数名的格式
LIBRARY bbb
   EXPORTS
test
使用了depends查看函数名格式依然为 "functionName@#"
yusmt 2008-01-24
  • 打赏
  • 举报
回复
谢谢各位,我使用了depends查看导出的函数后现在可以了,原来函数都改名了变成了 "functionName@#"的形式,

我以为在VC++中使用 "extern "C" __declspec(dllexport)"就不会变,但结果还是变了,而在BCB是不会变的。
而DEF文件的编写方法我现在还没有看懂,看来我的多加学习,学习是件快乐的事情。
guogangj 2008-01-24
  • 打赏
  • 举报
回复
用depends看看你的dll到底导出了什么函数?
cnzdgs 2008-01-24
  • 打赏
  • 举报
回复
def中写
EXPORTS
Test
就行了
yusmt 2008-01-23
  • 打赏
  • 举报
回复
改成
Declare Function test Lib "bbb.dll" Alias "test@0" _
(ByVal ico As Integer, ByVal infor As String, ByVal Tit As String) As Integer

但效果依旧
.def文件方式是什么方式,我第一次按触VC++,请多关照!
内存泄漏 2008-01-23
  • 打赏
  • 举报
回复
在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文件方式。
yusmt 2008-01-23
  • 打赏
  • 举报
回复
怎么有人回复偶?在线等啊!
jameshooo 2008-01-23
  • 打赏
  • 举报
回复
导出函数参数类型是char类型字符串,VB的String全部是UNICODE串,要么在VB中申明Byte()类型,要么修改你的函数参数为WCHAR
gisgan2006 2008-01-23
  • 打赏
  • 举报
回复
大家都说的很好. 我就不说了.
cnzdgs 2008-01-23
  • 打赏
  • 举报
回复
Declare Auto Function
内存泄漏 2008-01-23
  • 打赏
  • 举报
回复
一般的文件名可能是test@8,关于DEF文件的编写方法,可以参考http://blog.chinaunix.net/u/18517/showart_309975.html中的"模块定义文件(.def)"一段..

15,471

社区成员

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

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