вызвать функцию C с указателем структуры в качестве параметра - PullRequest
1 голос
/ 19 ноября 2010

Привет всем! Я пытаюсь получить данные от моего неуправляемого c-dll.Функция c ожидает указатель на структуру, инициализирует структуру с некоторым значением и завершает работу.Ошибка может быть где угодно, даже в объявлении cll.(Я делаю это в первый раз)

Здесь h-файл кода c:

#ifndef MYFUNCS_H
#define MYFUNCS_H

__declspec(dllexport) typedef struct t_Point{
 int x;
 int y;
} Point;

__declspec(dllexport) Point myFuncs();
__declspec(dllexport) int getPoint(Point* point);
#endif

c-файл:

#include "stdafx.h"
#include "OpenCVTest.h"

int getPoint(Point* point){
 point->x = 4;
 point->y = 2;
 return 0;
}

Оболочка в c #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace CSharp_mit_OpenCV
{
    [StructLayout(LayoutKind.Sequential)]
    public struct Point
    {
        public int x;
        public int y;
    };

    class Wrapper
    {
        [DllImport("OpenCV Test.dll", CharSet= CharSet.Auto)]
        public static extern int getPoint(ref Point point);

    }
}

И функция c #, которая использует эту оболочку:

Point p = new Point();
            Wrapper.getPoint(ref p);
            textBox1.Text = p.x.ToString();
            textBox2.Text = p.y.ToString();

С этим кодом я получаю следующую ошибку времени выполнения:

"Вызов функции PInvoke'CSharp mit OpenCV! CSharp_mit_OpenCV.Wrapper :: getPoint "разбалансировал стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой подписи. Проверьте, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи."

Что здесь не так?Пожалуйста помоги!Спасибо всем!

1 Ответ

0 голосов
/ 19 ноября 2010

Какое соглашение о вызовах используется вашим C-проектом? Если это cdecl (по умолчанию IIRC), вам необходимо явно указать его в атрибуте DllImport :

[DllImport("OpenCV Test.dll", CharSet = CharSet.Auto,
    CallingConvention = CallingConvention.Cdecl)]
public static extern int getPoint(ref Point point);
...