Свежие обсуждения
Компьютеры

Позвать функцию на Си

1 3 4

chav1961: на SensorData *data
Угомонился. А это значит что функция ждет указатель? А я ей адрес подсовываю? Или как?
Теперь:
POLINK: error: Unresolved external symbol 'HTCSensorGetDataOutput'.
POLINK: error: Unresolved external symbol 'HTCSensorOpen'.
POLINK: error: Unresolved external symbol 'HTCSensorClose'.
POLINK: fatal error: 3 unresolved external(s).
А это уймется если через GetProcAddress?

 

1. Тип "ссылка" в С++ ( SensorData & xxx) - это, на самом деле, указатель (т.е. SensorData * xxx), но, в отличие от указателя, ссылка не требует разыменования, т.е вместо (*data).filed пишется просто data.field. В некотором смысле они взаимозаменяемые.

2. Да, конечно уймется. Дело в том, что с DLL связка происходит на стадии выполнения (через LoadLibrary и GetProcAddress), поэтому и объявлять точки входа нужно так, как я вам раньше писал, иначе линкер будет пытаться их разрешить в момент сборки exe-шника.

 

Теперь недоволен этими строчками:
HTCSensorClose= (int (*)(int))GetProcAddress(hLib,_T("HTCSensorClose"));
HTCSensorGetDataOutput = (int (*)(int))GetProcAddress(hLib,_T("HTCSensorGetDataOutput "));

Vmax\main.c(182): warning #2168: Operands of = have incompatible types 'int __stdcall function(void *)' and 'int __stdcall function(int)'.
Vmax\main.c(183): warning #2168: Operands of = have incompatible types 'int __stdcall function(void *, SensorData *)' and 'int __stdcall function(int)'.
Попробовал запустить на кпк , все корректно(запускается , выходит) , но ничего не происходит.

 

По идее, описания должны были получиться следующими:

HANDLE (*HTCSensorOpen)(int sensor_ID);
int (*HTCSensorClose)(HANDLE handle);
int (*HTCSensorGetDataOutput)(HANDLE handle, SensorData *data);

Соответственно, определение адресов:

HTCSensorOpen= (HANDLE (*)(int))GetProcAddress(hLib,_T("HTCSensorOpen"));
HTCSensorClose= (int (*)(HANDLE))GetProcAddress(hLib,_T("HTCSensorClose"));
HTCSensorGetDataOutput = (int (*)(HANDLE,SensorData *))GetProcAddress(hLib,_T("HTCSensorGetDataOutput "));

Ну и вызовы:

hGsens= (*HTCSensorOpen)(1);
(*HTCSensorClose)(hGsens);
rezult=(*HTCSensorGetDataOutput)(hGsens,&data);

Ну а насчет "ничего не происходит", увы, помочь ничем не смогу: отладка через форум - боюсь, что такого не бывает Ставьте трассу, выдавайте сообщения через MessageBox, проверяйте коды возврата - что тут еще сказать...

 

Спасибо, но все тихо.
Попробую пойти в обход есть тестовая программка на покет программ лангвиже.

 

Пришел к выводу, что эта функция все стопорит. Без нее часики тикают.

 

Я думаю, адрес функции HTCSensorGetDataOutput не находится!
Вывел в окошечки содержимое указателей (наверно) на эти функции , так вот в полях сенсороупкн и сенсклоуз -цифирки , а гетдата -пустота.

 

Мне кажется, у вас в названии HTCSensorGetDataOutput пробел в конце, когда вы пользуетесь GetProcAddress. Если она такого имени не находит, действительно возвращается адрес NULL. Загляните на всякий случай еще и в саму ДЛЛ-ку (хотя бы блокнотом), поищите такое имя через Ctrl-F

 

chav1961: пробел в конце
Да! А как вы догадались?
Но помогло не сильно, теперь в окошках нули.
Меня смутило, что что два адреса показались одинаковыми 8) , подскажите чем преобразовать адрес, чтобы он смотрелся длинным целым.
И еще : под структуру память сначала (структуры)отводится ? Дело в том , что в ней разночтения , в одних источниках одно кол-во полей, в других..
Поэтому я в середину вставил два интеджер , а нужны мне первые три коротких со знаком.

 

Преобразовать адрес можно, например, так:

char buffer[100];

sprintf(buffer,"addr=%08x",(unsigned long)адрес);

MеssageBox(NULL,buffer,"test",MB_OK);

Адреса, конечно, должны оказаться разные.

Память под структуру отводится, как вы выразились, "сначала" Если есть сомнения по размеру, просто допишите в конец какой-нибудь большой массив, например char empty[100]; Было бы здорово посмотреть содержимое структуры до вызова и после вызова.