高手看过来:VB 调用 C++ dll问题
救救我,我对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);
}
请问为什么呢?
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);
}
请问为什么呢?
...全文
相关推荐
VB call vc dll
**VB调用VC DLL的基本步骤:**1. **创建VC DLL项目:** - 在Visual Studio中选择新建项目,然后选择C++的DLL模板。
MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明.pdf
**使用VBA调用DLL**: - 创建VBA或VB工程,通过`Declare`语句声明DLL中的函数,指定函数库路径和函数名。这允许VBA或VB程序调用已经生成的DLL中的函数。
MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明.docx
**VBA或VB调用DLL**: - 在VBA或VB环境中,需要声明DLL函数的原型,并指定DLL文件的位置。
突破VB之DLL编写教程
总结来说,通过手工编写DLL并使用C/C++编译器进行编译和链接,不仅可以加深对DLL的理解,还能提升解决实际编程问题的能力。
dll编写教程.pdf
* DLL 库可以供多种编程语言使用:例如用 C 编写的 DLL 可以在 VB 中调用。2. DLL 的基本概念:* DLL 是一个独立的文件,包含了可供其他程序调用的函数和变量。


