将整数从VB.Net传递到C++dll
Passing integers from VB.Net to C++ dll
我有个问题,就是想不通。我试图通过使用包装器函数从VB.Net调用C++类的一个成员函数,并传递一个指向该包装器函数的指针。
C++:
class _declspec(dllexport) MyClass{
public:
int multiply(int x, int y) const;
char* get_name() const;
};
_declspec(dllexport) void* createMyClass();
_declspec(dllexport) void destroyMyClass(void* objptr);
_declspec(dllexport) int MyClass_multiply(void* objptr, int x, int y);
定义为:
int MyClass::multiply(int x, int y) const
{
return x * y;
}
char* MyClass::get_name() const
{
return "jensa";
}
void* createMyClass()
{
return new MyClass;
}
void destroyMyClass(void* objptr)
{
delete static_cast<MyClass*>(objptr);
}
int MyClass_multiply(void* objptr, int x, int y)
{
std::ofstream fout("jojo.txt", std::ios::out);
fout << x << std::endl;
fout << y << std::endl;
MyClass* p = (MyClass*)(objptr); // Explicit type cast
fout << p->get_name() << std::endl;
fout.close();
return p->multiply(x,y);
}
我使用流只是为了检查C++函数MyClass_multiply中的参数实际是什么。如果我像这样从VB.Net调用函数
<DllImport(Constants.DLL_PATH, EntryPoint:="MyClass_multiply", CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function MyClass_multiply(ByVal objptr As Long, ByVal x As Long, ByVal y As Long) As Long
End Function
Dim objptr As Long = createMyClass()
Me.TextBox3.Text = MyClass_multiply(objptr, 2, 3)
我发现C++函数MyClass_multiply中的第一个整数参数x变成了一些奇怪的值,比如63203420,而参数y采用了x设置的值。当我在C++dll中创建一个类似的函数add时,它只接受两个整数,没有void*,一切都很好。我是不是对虚空做了什么错事?(注意:我正在使用http://www.codeproject.com/Articles/6244/Step-by-Step-Calling-C-DLLs-from-VC-and-VB-Part)。
谢谢!
编辑:我使用的是.def文件。
LIBRARY MyLib.dll
EXPORTS
add
createMyClass
destroyMyClass
MyClass_multiply
Private Shared Function MyClass_multiply(ByVal objptr As IntPtr, ByVal x As Integer, ByVal y As Integer) As Integer
End Function
若你们有许多本机代码应该被p/调用,你们可以试试这个工具。它为c#和VB.Net 生成
使Pinvoke易于
它现在似乎正在工作。我改变了的所有出现
objptr As Long
至
objPtr As IntPtr
按照你的建议。我还注意到,我需要所有其他变量(MyClass_multiply函数中的x和y)的类型为Integer,而不是Long。也就是说,
<DllImport(Constants.DLL_PATH, EntryPoint:="MyClass_multiply", CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function MyClass_multiply(ByVal objptr As IntPtr, ByVal x As Integer, ByVal y As Integer) As Integer
End Function
需要明确的是:正如你所建议的,我需要制作所有其他类型的整数。将函数参数设置为Integer和返回值Long不起作用。具有Long函数参数但具有Integer返回值也不起作用。希望这能帮助其他处于类似情况的人!谢谢
相关文章:
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- 是否可以在Linux上使用.Net Core 3.1创建C++/CLI代码的C#DLL
- C++ DLL(不是 CLI)是否可以调用 .NET Core 3.0 委托?
- 如何将 VB.Net 字符串作为字符*传递给C++dll?
- VB.NET DLL中的C++DLL函数复制
- .NET核心应用程序无法加载C++DLL
- 如何使函数返回数组?用于制作在VB.NET中使用的DLL
- 是否可以编译使用 .NET DLL 和 GCC 的C++?
- 列出 C# 中的 non-.NET DLL 函数
- 必须使用C DLL调用C#.NET方法
- C++ DLL 包装器 vb.net 传递字节数组的字节数组?
- .NET CORE 2 DLL引用带有C 代码运行时错误
- 内存损坏从vb.net调用c dll
- 如何为64位应用程序注册.NET DLL
- 调用从.NET Core中的C++项目构建的.dll时出现BadImageFormatException
- Clr dll .net control
- 如何在Windows formc++中添加本地c++ dll.. NET项目
- 从ASP调用后端.net dll.. NET Web api