На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Передать структуру в DLL , DLL на Си , приложение C#WPF
    Уважаемые знатоки C# , подскажите такую тему,
    имеется DLL на Си , (без исходника , только .h и инструкция описание на функции этой DLL)
    требуется использование этих функций в программе на C#WPF,

    например я делаю так
    ExpandedWrap disabled
       [DllImport(@"hscli.dll")]
       static extern int hcSqlCheckInit();
              
       private void button_Click(object sender, RoutedEventArgs e)
         {
                  int err = -300000;
                  
                  err =  hcSqlCheckInit() ;
       
                  textBox_Copy3.AppendText("hcSqlCheckInit err = " + err.ToString() ) ;
       
              }

    и это работает потому что функция без параметров , я ее вызываю, и она отрабатывает

    а вот другую функцию на вход которой надо подать структуру , я уже не знаю как , хотя в инструкции к этой функции написано что можно подать 0 , но ноль не берет
    вот описание https://hytechdb.ru/index.php?s=docs&ru=V25..._hcSqlParmT.htm

    если бы как то так сделать можно было бы

    ExpandedWrap disabled
      [DllImport(@"hscli.dll")]
      static extern int hcSqlInit(  0   );
       
      private void button_Click(object sender, RoutedEventArgs e)
       {
                  int err = -300000;
                  
                  err =  hcSqlInit(  0  ) ;
       
                  textBox_Copy3.AppendText("hcSqlInit err = " + err.ToString() ) ;
       
       }


    на Си я ее вызываю
    ExpandedWrap disabled
       hcSqlParmT Init = { sizeof(Init) }; // Адрес структуры с параметрами инициализации
       err = hcSqlInit(&Init)        ; // Инициализация клиентской части

    но на С++ там то есть и .h файл я подключаю и LIB-ку к проекту
    а тут чисто динамически ,

    как объявить структуру

    Добавлено
    один код как бы попался на глаза но прилепить к сибе я его так и не смог http://www.adp-gmbh.ch/csharp/call_dll.html
      с этой структурой разобрался

      Добавлено
      Теперь вот не могу воткнутся в следующую
      ExpandedWrap disabled
         [StructLayout(LayoutKind.Sequential)]
                unsafe struct hcSqlDstInfoT     // Структура "Информация о колонках результата"
                {
                    public int aliasno;
                    public int fieldno;
                    public int type;
                    public uint len;
                    public uint off;
                    public fixed char coder[32];
                    public fixed char fname[32];
                    public int func;
                    public fixed char asname[32];
                    public int key;
                    public int resno;
                };
         
        private unsafe void button_Click(object sender, RoutedEventArgs e)
        {
          hcSqlDstInfoT[] infCol  =  new hcSqlDstInfoT[pCol]; // Структура "Информация о колонках результата"
         
          err = hcSqlReadResults(pOper, 0, bufOut, pRecSize * (uint)pStr, &cntOut);// Чтение результатов
         
        }


      и вот на этой функции вывлетает ошибка
      ExpandedWrap disabled
        Помощник отладки управляемого кода "PInvokeStackImbalance" обнаружил неполадку в " \ComHyTech.vshost.exe".
         
        Дополнительные сведения: Вызов функции PInvoke "ComHyTech!ComHyTech.MainWindow::hcSqlReadResults" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.
      Сообщение отредактировано: kms -
        так как я переделываю этот код из С/С++ на С++ он выглядит вот так
        ExpandedWrap disabled
          typedef struct hcSqlDstInfoT
          {   int     aliasno;
              int     fieldno;
              int     type;
              unsigned    len;
              unsigned    off;
              char        coder[32];
              char        fname[32];
              int     func;
              char        asname[32];
              int     key;
              int     resno;
          } hcSqlDstInfoT;
           
          hcSqlDstInfoT *infCol = new hcSqlDstInfoT[pCol] ; // Структура "Информация о колонках результата"
           
          err = hcSqlGetStmtAttr(pOper, HSCLI_STMT_DST_INFO, 0, infCol, pCol * SIZE_HCSQLDSTINFOT, &cntOp) ;


        а вот как переделать на C#
          чувак походу шарписты не юзают такой изврат :D
          у шарпистов все свое все новое, так сказать онли ньютехноложи :D

          Добавлено
          шарписты они все сидят на ASP.NET а там С++ и не пахнет, сам малеха сидел на ASP.NET :D
            Цитата Cfon @
            чувак походу шарписты не юзают такой изврат
            у шарпистов все свое все новое, так сказать онли ньютехноложи

            Добавлено Сегодня, 15:54
            шарписты они все сидят на ASP.NET а там С++ и не пахнет, сам малеха сидел на ASP.NET



            эт точно :)
              сам спросил сам ответил , всем спасибо по этой структуре вопрос закрыт , теперь другая функция колом стала
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0256 ]   [ 16 queries used ]   [ Generated: 18.04.24, 17:10 GMT ]