繁体   English   中英

从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);
}

我仅使用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中创建一个类似的函数时,该函数只接受两个整数且没有void *,一切正常。 我对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

明确一点:正如您所建议的,我需要将所有其他类型设置为Integers。 使函数参数为Integer且返回值Long无效。 具有Long函数参数但Integer返回值也不起作用。 希望这可以帮助处于类似情况的其他人! 谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM