Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Импорт очереди из С++ в С#


Автор: agealex 3.9.2007, 14:35
Вот кусок кода



Код

С++
...

#ifdef DRIVER_EXPORTS
#define DRIVER_API __declspec(dllexport)
#endif

DRIVER_API std::queue<UCHAR> qRecv                     ;

...

С#
[DllImport("C:/pockettest/Driver.dll")]
  public static extern queue<byte> qRecv;
 - знаю что не верно как правельно обьявить?  

и как потом вынуть оттуда элемент? в с++ разобрался а в шарпе еще нет

или мне нужно экспортировать из с++ функцию которая возвращает элемент очереди или указатель на этот элемент? вобщем как это можно сделать? smile 

спасибо

Автор: FREEDEV 3.9.2007, 22:29
вот пример для функций, попробуй от него соорудить

 private const string MYDLL = "mydll.dll";
Код

 [DllImport(MYDLL,
            EntryPoint="SomeFunction",
            CallingConvention=CallingConvention.StdCall)]
        private static extern int Init(IntPtr SomeVariable);



т.к. компилятор дописывает информацию к именам функций/переменных тебе понадоьбиться  утилитка dumpbin. она выведет имена переменных и функций в том виде в котором они находяться в dll:
dumpbin /exports MyDll.dll

Автор: agealex 3.9.2007, 22:53
 К сожалению не знаю, что за утилитка- если она внешняя - то я не могу ее использовать пока нашел только вот такой пример
 с использованием маршала

Код

С++
#ifdef DRIVER_EXPORTS
#define DRIVER_API __declspec(dllexport)
#endif
//return false - очередь пуста
queue<UCHAR> qRecv             ;
DRIVER_API bool  DrvMsgREcv(int MsgSize,UCHAR * QElement)

    if(!qRecv.empty())
    {
        QElement = (qRecv.front());
        qRecv.pop();
        MsgSize = sizeof(&QElement);
        return 1;
    }
    return 0;

C#


 [DllImport("C:/pockettest/Driver.dll")]
 public static extern bool DrvMsgRecv(ref IntPtr MsgSize,ref IntPtr QElement);

 public const int bufsize = 200; // Максимальный размер буфера

 public byte[] buffer = new byte[bufsize]; //Буфер 
 ...тут функция
 Marshal.Copy(QElement, buffer, 0, MsgSize);
 

Что то примерно такое только еще до конца не разобрался- но в теории должно работать, к утру узнаю надеюсь если поможите то и раньшеsmile

Автор: FREEDEV 3.9.2007, 23:26
SDK Command Promt -> dumpbin - будешь знать как компилятор украсил название твоей функции, хотя может в твоем варианте это и не нужно, но лучше глянуть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)