高手看过来: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);
}
请问为什么呢?
...全文
175 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
感谢楼上的解答,我测试没有问题了就给分哈
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了易用的一键式设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。在常规修复过程中,程序还会自动检测DirectX加速状态,在异常时给予用户相应提示。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V4.0版分为标准版、增强版以及在线修复版。所有版本都支持修复DirectX的功能,而增强版则额外支持修复c++的功能。在线修复版功能与标准版相同,但其所需的数据包需要在修复时自动下载。各个版本之间,主程序完全相同,只是其配套使用的数据包不同。因此,标准版和在线修复版可以通过补全扩展包的形式成为增强版。本程序自V3.5版起,自带扩展功能。只要在主界面的“工具”菜单下打开“选项”对话框,找到“扩展”标签,点击其中的“开始扩展”按钮即可。扩展过程需要Internet连接,扩展成功后新的数据包可自动生效。扩展用时根据网络速度不同而不同,最快仅需数秒,最慢需要数分钟,烦请耐心等待。如扩展失败,可点击“扩展”界面左上角小锁图标切换为加密连接,即可很大程度上避免因防火墙或其他原因导致的连接失败。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有更新系统c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。除常规修复外,新版程序还支持C++强力修复功能。当常规修复无效时,可以到本程序的选项界面内开启强力修复功能,可大幅提高修复成功率。请注意,请仅在常规修复无效时再使用此功能。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 新版程序支持命令行运行模式。在命令行中调用本程序,可以在路径后直接添加命令进行相应的设置。常见的命令有7类,分别是设置语言的命令、设置窗口模式的命令,设置安全级别的命令、开启强力修复的命令、设置c++修复模式的命令、控制Direct加速的命令、显示版权信息的命令。具体命令名称可以通过“/help”或“/?”进行查询。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了7项高级功能。点击"常规”选项卡可以调整程序的基本运行情况,包括日志记录、安全级别控制、调试模式开启等。只有开启调试模式后才能在C++修复失败时显示详细错误信息,并提示用户进行手动修复。在“高级”选项卡中,可以控制C++的修复模式,默认为智能模式,即当程序检测到系统中C++存在问题时提示修复,否则不提示。强制检测模式下,程序将总是检查C++的情况,即使在C++已经正常或没有C++数据包时。默认不勾选模式与智能模式基本相同,只是修复C++的箭头默认处于不勾选状态,需要用户手动勾选后才会进行修复。不提示异常模式,只对标准版或在线修复版生效,即在常规检测后不再提示可能导致0xc000007b错误的C++异常。不检测模式,不再检测C++的状态,程序将只进行DirectX的检测与修复。C++强力修复功能,通过全新的代码设计,彻底改善对于顽固异常文件的处理,极大提高修复成功率。API Sets强力修复功能,参照了DirectX文件的精细修复方式,极大地改善了修复失败的情况。请仅在正常修复无效时再启用这两项强力修复功能。在“注册”选项卡中,程序可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“扩展”选项卡可以将任意版本的程序扩展成增强版。点击“DirectX版本”选项卡,可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。如果显卡驱动异常(包括显卡驱动未安装或显卡驱动太旧),程序会在该页面右上角进行提示。在“实验室”选项卡中,用户可以控制是否允许更新为最新的测试版程序,以及在更新后的数据包更新策略。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填写E-mail地址)的。 本程序内置自动更新程序,用户只需在“关于”对话框中点击相应按钮,即可自动升级至最新版本。升级后会自动根据用户指定的更新策略更新C++数据包。如果因网络原因或服务器异常导致升级失败,用户也可以前往本程序官方博客手动下载最新版程序。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7、Windows 8、Windows 10及后续用户,可以直接运行本程序。

65,199

社区成员

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

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