Передача целых чисел из VB.Net в C ++ dll

0

У меня проблема, которую я просто не могу понять. Я пытаюсь вызвать функцию-член класса C++ из VB.Net с помощью функции-оболочки и передать указатель на эту функцию-оболочку.

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

Я использую thestream только для проверки того, что аргументы фактически находятся внутри функции 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 *, все работало нормально. Я делаю что-то не так с пустотой *? (Примечание. Я использую 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
Теги:
dll

2 ответа

1
Лучший ответ
Private Shared Function MyClass_multiply(ByVal objptr As IntPtr, ByVal x As Integer, ByVal y As Integer) As Integer
End Function

Если у вас много кодов native, которые должны быть p/invoked, вы можете попробовать инструмент. Он генерирует как для С#, так и для VB.Net

делает Pinvoke легким

  • 0
    Я попробую это! Вернемся к тому, как это получилось. Благодарю.
  • 0
    Я опубликовал бесплатный инструмент для его создания, сделанный командой Microsoft. Проверьте это тоже
0

Кажется, сейчас он работает. Я изменил все вхождения

objptr As Long

в

objPtr As IntPtr

по вашему предложению. Я также заметил, что мне нужны все остальные переменные (x и y в функции MyClass_multiply) типа 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 не сработало. Имея длинные аргументы функции, но возвращаемое значение Integer тоже не работает. Надеюсь, это может помочь другим в подобной ситуации! Благодарю!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню