高手看过来:VB 调用 C++ dll问题

oicqkill 2005-07-26 11:32:36
救救我,我对VB不熟悉啊。我在c++中输出函数如下:
m.def文件中
EXPORTS
fnDoMatch @1
m.h文件中
BOOL __stdcall fnDoMatch(const char *pszImgPathFileName, char *pszOutStr, int nOutStrLen);

生成的dll在VB中的调用的代码如下:
Private Declare Function fnDoMatch Lib "IdentifyDll.dll" (ByVal szImgFileName As String, ByRef szOut As String, ByVal OutBufLen As Integer) As Long

Private Sub Command1_Click()
Dim szFile As String
Dim szOut As String
Dim OutBufLen As Long
Dim I As Long
CommonDialog1.ShowOpen
szFile = CommonDialog1.FileName
szOut = Space(255)
I = fnDoMatch(szFile, szOut, OutBufLen)
MsgBox "i=" & I
MsgBox "szFile=" & szFile
MsgBox Left(szOut, OutBufLen)
End Sub
不知道为什么,调用总是失败,我在c++中的调用代码如下:
是没有问题的
我在VC的编译dll中
c/c++->code generation->struct member alignment-》已经选成4 bytes了
请问还有其他的需要调整吗?

HINSTANCE hs = LoadLibrary("m.dll");
if(hs)
{
try
{
pfnDoMatch = (fnDoMatch *)GetProcAddress((HINSTANCE)hs, "fnDoMatch");
if(pfnDoMatch)
{
char szOut[5] = {'\0'};
// fnDoMatch(g_szFileName, szOut, sizeof(szOut));
(*pfnDoMatch)(g_szFileName, szOut, sizeof(szOut));
TextOut(GetDC(hWnd), 10, 10, szOut, strlen(szOut));

}
}
catch (...)
{
}
FreeLibrary(hs);
}
请问为什么呢?
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandrowjw 2005-07-27
  • 打赏
  • 举报
回复
还不行?那个方法要自己调试一下的,调用API比较好控制,实在不行就通过窗口标题或者文件什么的传字符串吧。
sandrowjw 2005-07-26
  • 打赏
  • 举报
回复
Private Declare Function fnDoMatch Lib "IdentifyDll.dll" (ByVal szImgFileName As String, ByRef szOut As String, ByVal OutBufLen As Integer) As Long

这个原型不行,VB中的String实际上是一个包装类,第一个和第二个参数要传入raw ptr,不能直接用这个类传。原型应该定义成这样:

Private Declare Function fnDoMatch Lib "IdentifyDll.dll" (ByVal szImgFileName As Long, ByRef szOut As Long, ByVal OutBufLen As Integer) As Long

然后用StrPtr(your_vbstring)来将你的VB的String转成raw pointer。注意第二个参数要预先分配空间的,你可以用Space分配。
还有一个办法是调用API函数LocalAlloc分配一块空间,返回的直接就是指针不用转换了,然后用CopyMemory把你的字符串copy进去。
另外,这里要注意函数的调用规范,确保你的c函数不是__cdelc的而是__stdcall的,否则可能无法正常传递参数(比如sprintf就会发生内存访问错误)。
oicqkill 2005-07-26
  • 打赏
  • 举报
回复
要命的是什么错误都没有报出来
oicqkill 2005-07-26
  • 打赏
  • 举报
回复
补充说明:我在.h中如下:
#define IDENTIFYDLL_EXPORTS 1

#ifdef IDENTIFYDLL_EXPORTS
#define IDENTIFYDLL_API __declspec(dllexport)
#else
#define IDENTIFYDLL_API __declspec(dllimport)
#endif

// IDENTIFYDLL_API BOOL fnDoMatch(const char *pszImgPathFileName, char *pszOutStr, int nOutStrLen);
extern "C"
{
BOOL IDENTIFYDLL_API __stdcall fnDoMatch(const char *pszImgPathFileName, char *pszOutStr, int nOutStrLen);
}
.cpp中如下:

extern "C"
BOOL IDENTIFYDLL_API __stdcall fnDoMatch(const char *pszImgPathFileName, char *pszOutStr, int nOutStrLen)
{
....
}
我在VC的编译dll中
c/c++->code generation->struct member alignment-》已经选成4 bytes了
请问还有其他的需要调整吗?

Jagen在路上 2005-07-26
  • 打赏
  • 举报
回复
提示的是什么错误?
oicqkill 2005-07-26
  • 打赏
  • 举报
回复
感谢楼上的解答,我测试没有问题了就给分哈

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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