最近的项目中的一个DLL的接口如下:
FINANCE_API bool LoadFile(const char* szFile, char** szBuf,const char* szKey,char szErrMsg[],const char* szCorp,const char* szType,int iVer);
在VB中如何调用?主要是三种类型:const char*,char**,char szErrMsg[],尤其是char**的调用,请各路大侠指教。
FINANCE_API bool LoadFile(const char* szFile, char** szBuf,const char* szKey,char szErrMsg[],const char* szCorp,const char* szType,int iVer);
在VB中如何调用?主要是三种类型:const char*,char**,char szErrMsg[],尤其是char**的调用,请各路大侠指教。
解决方案 »
- 这个winsock发邮件,报错"503 Error: send HELO/EHLO first",要怎么修改下?
- api 动态菜单 中 实现 记录已打开的多个窗口 从而通过菜单实现窗体切换(在MDI子窗体中 )
- 发现“实时错误'94'无效使用Null”请问如何解决
- 高分求一个简单工程,vb的数据库的,
- 请教关于excel数据的读取(在线等)
- 实时错误'3709'
- 在按f5执行程序和结束程序时,每次都是有很多窗体在闪动,这样眼睛都晕了,而且浪费时间
- 如何将多个word文档合并到一个word文档
- 我作的VB东东运行完后显示"对象变量或WITH块变量未设置",这是怎么回事?怎么改?
- commondialog 的打印机设置问题!
- 我用数据库保存用户的用户名和密码,并且通过查找有没有相符合条件的记录来判断用户是否合法,但是怎么大小写都行啊?
- 有没有书店卖书零售管理系统 讨论有分
Dim VBszBuf as String
Dim OrgP as long
'修改VBszBuf的长度
VBszBuf=Space(n) 'n是可能的长度
CopyMemory(varptr(OrgP),varptr(VBszBuf),4) '保存原来的指针
CopyMemory(varptr(VBszBuf),varptr(szBuf), 4) '替换String指针
'现在你可以使用VBszBuf来访问数据了CopyMemory(varptr(VBszBuf),varptr(OrgP),4) '还原String指针。
也许你把这个函数改编一下来直接使用
LoadFile(const char* szFile, //ByVal szFile as String
char** szBuf, //ByRef szBuf as Any
const char* szKey, //ByVal szKey as String
char szErrMsg[], //ByVal szErrMsg as String
const char* szCorp, //ByVal szCorp as String
const char* szType, //ByVal szType as String
int iVer //ByVal iVer as Long
); Dim szBuf as LongLoadFile szFile, szBuf, szKey, szErrMsg, szCorp,szType, iVer
szBuf的值就是新分配内存空间的首地址。奇怪的是既然分配了内存给Buff,规范一些的应该有Buff的长度给出。大概这块Buff以'\0'结束?
接着可以用CopyMemory得到buff的数据:
但是你的API声明CopyMemory必须做一个新的更改,姑且称之为CopyMemory1
CopyMemory1 ByRef Dest as Any, ByVal Src as long, Length as Long
//假设长度是BuffSize
Dim byBuff(0 to BuffSize - 1) as ByteCopyMemory1 byBuff(0), szBuff, BuffSize用完后释放空间
FreeBuffer(char** Buff)就声明FreeBuff(ByRef Buff as long)
FreeBuffer(char* Buff)就声明FreeBuff(ByVal Buff as long)
FreeBuffer(szBuff)即可
另外,lazygod兄的写法中有个错误,LoadFile这个函数是有一个bool的返回值的~~另外这个函数中,szBuf和szErrMsg需要输出的变量,而且dll的说明中明确指出在调用函数前szErrMsg是一定要初始化的。对于这点我的理解就是szBuf是在函数内部分配内存的,而szErrMsg则是在函数外就要分配好内存的首地址~~
Declare Function LoadFile Lib "dll文件名" (ByVal szFile _
As String, ByRef szBuf As Any, ByVal szKey As String, ByVal _
szErrMsg As String, ByVal szCorp As String, ByVal szType As _
String, ByVal iVer As Long) As Byte
调用:
Dim szBuf As Long
Dim szErrMsg As String
Dim ret As ByteszErrMsg = Space(1024)ret = LoadFile("c:\temp\test.pam", szBuf, "", szErrMsg, "000", "", 20)请大大继续指教~~
你是怎么调用的?就是你申明的函数原型是什么?
是不是就是“FINANCE_API bool LoadFile(const char* szFile, char** szBuf,const char* szKey,char szErrMsg[],const char* szCorp,const char* szType,int iVer); ”
哪你查查FINANCE_API是什么的定义?
或者直接声明为“bool LoadFile(const char* szFile, char** szBuf,const char* szKey,char szErrMsg[],const char* szCorp,const char* szType,int iVer); ”
这种情况下编译器默认是_cdecl 而不是 stdcall,如果是这样就没有办法在VB中直接调用了。
char** szBuf,
const char* szKey,
char szErrMsg[],
const char* szCorp,
const char* szType,
int iVer);
FBLoadFile pLoadFile;
pLoadFile = (FBLoadFile)(::GetProcAddress(hFinance, "LoadFile"));估计正如楼上兄台所讲,这个api不能让vb直接调用,后来我有自己编了一个com控件,让vb调用com控件这种方法来曲线救国~~