我有一个我无法弄清楚的问题。我试图通过使用包装器函数从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);
}
我使用ofstream只是为了检查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
答案 0 :(得分:1)
Private Shared Function MyClass_multiply(ByVal objptr As IntPtr, ByVal x As Integer, ByVal y As Integer) As Integer
End Function
如果您有许多应该被调用的本机代码,您可以尝试使用工具。它产生于c#和VB.Net
答案 1 :(得分:0)
现在似乎正在运作。我改变了所有出现的
objptr As Long
到
objPtr As IntPtr
根据你的建议。我还注意到我需要所有其他变量(MyClass_multiply函数中的x和y)为Integer,NOT 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返回值也不起作用。 希望这可以帮助处于类似情况的其他人! 谢谢!