6 / 6 / 2
Регистрация: 11.04.2011
Сообщений: 260
1

Ошибка при вызове функции из другой библиотеки

24.06.2014, 18:06. Показов 1495. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
У меня есть библиотека с функциями написанными на С. При попытке использования одной из них выдаёт ошибку:
Не удаётся найти точку входа ctCiCode в "CtApi.dll"
Вот так я импортирую:

C#
1
2
[DllImport("CtApi.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
        public static extern UInt32 ctCiCode(IntPtr hCTAPI, string sCmd, UInt32 hWin, UInt32 nMode, char[] sResult, UInt32 dwLength, CTOVERLAPPED pctOverlapped);
Тип последней переменной CTOVERLAPPED является структурой, которую описал след. образом:

На С она выглядит так:
C
1
2
3
4
5
6
7
8
typedef struct
{
    DWORD       dwStatus;   /* completion status        */
    DWORD       dwLength;   /* length of result buffer  */
    BYTE*       pData;      /* result buffer        */
    DWORD       OffsetHigh; /* not used (as per Win32)  */
    HANDLE      hEvent;     /* event handle to signal   */
}   CTOVERLAPPED;
Переписал её у себя так:

C#
1
2
3
4
5
6
7
8
9
[StructLayout(LayoutKind.Sequential)]
        public struct CTOVERLAPPED
        {
            UInt32      dwStatus;   /* completion status        */
            UInt32      dwLength;   /* length of result buffer  */
            char        pData;      /* result buffer        */
            UInt32      OffsetHigh; /* not used (as per Win32)  */
            IntPtr      hEvent;     /* event handle to signal   */
        }
Вызываю следующим образом эту функцию:

C#
1
2
3
4
5
char[] ctapiout = new char[255];
IntPtr x;
bool is_connected;
 
var err = ctCiCode(x,str, 0, 0, ctapiout, 255, null);
Ругается что нельзя вместо этого аргумента передать null и не компилится.
Убираю вообще этот аргумент, компилирую, запускаю и получаю ошибку указанную мною выше.
Помогите пожалуйста, где копать? В других языках я видел передавали вместо этого аргумента NULL. Что я неправильно делаю?
Заранее спасибо!!! )
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2014, 18:06
Ответы с готовыми решениями:

Ошибка при вызове функции из родительской страницы
есть такая задача: есть родительское окно с фрэймом (iframe) в котором после загрузки открывается...

Ошибка при вызове функции из dll в С#
HElp! сама dll вроде как подключена(метод meth2 работает) но при попытке обращения к GaussMethod...

При вызове функции из другой формы ничего не происходит
Здравствуйте! Столкнулся с такой проблемой - при вызове функции из другой формы ничего не...

Ошибка при повторном вызове другой формы: ObjectDisposedException
Пытаюсь вызвать другую форму посредством From2 f2 = new From2(); f2.Show(); В другой форме...

4
31 / 30 / 13
Регистрация: 15.02.2014
Сообщений: 157
24.06.2014, 18:08 2
romasimeiz, а какая ошибка когда null есть
0
9 / 9 / 5
Регистрация: 23.06.2014
Сообщений: 40
24.06.2014, 18:32 3
Может быть потому что CTOVERLAPPED - есть структура, т.е. значимый тип, а не ссылочный?
Посмотрите тему "Маршалинг структур".
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
24.06.2014, 19:17 4
Лучший ответ Сообщение было отмечено romasimeiz как решение

Решение

Цитата Сообщение от romasimeiz Посмотреть сообщение
При попытке использования одной из них выдаёт ошибку:
Хорошо бы функцию на C показать.
Если там нуль передавать, зачем структуру описывать ?
Последний параметр IntPtr скорей всего сделать , ну и вместо null : IntPtr.Zero.
Цитата Сообщение от romasimeiz Посмотреть сообщение
Не удаётся найти точку входа ctCiCode в "CtApi.dll"
Посмотрите может имя функции искажено. В командной строке Visual Studio вводите
dumpbin.exe /EXPORTS ( путь до библиотеки + имя )
и смотрите реальное имя .
1
6 / 6 / 2
Регистрация: 11.04.2011
Сообщений: 260
25.06.2014, 10:12  [ТС] 5
Всем огромное спасибо за советы. Сделал как говорил MrCold,
Цитата Сообщение от MrCold Посмотреть сообщение
Посмотрите может имя функции искажено. В командной строке Visual Studio вводите
dumpbin.exe /EXPORTS ( путь до библиотеки + имя )
и смотрите реальное имя
Таки да. Одна буква была не того регистра )))

Цитата Сообщение от MrCold Посмотреть сообщение
Последний параметр IntPtr скорей всего сделать , ну и вместо null : IntPtr.Zero.
Помогло!!!

Огромное всем спасибо!!!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2014, 10:12
Помогаю со студенческими работами здесь

Кошелёк Bitcoin. Ошибка при вызове функции из библиотеки blockchain info
Я пытаюсь разобраться с blockchain API на github ...

Ошибка при вызове функции
Добрый день! Есть функция по расчету детерминанта int _det(int size,double **arr,double &det) {...

Ошибка при вызове функции
В функции NewWords вызывается функция correct,при отладке я не могу войти в эту функцию,к тому же...

Ошибка при вызове функции
При вызове функции выдает ошибку - Fatal error: Call to a member function get_results() on null in...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru