Могу ли я использовать API для 64-битных драйверов в проекте Win32 C ++? - PullRequest
1 голос
/ 01 июля 2010

Итак, я пытаюсь заставить работать это оборудование ядерных приборов.

Я установил 64-разрядные драйверы (я использую 64-разрядную версию Windows 7), и я скачал DLL, которые идут с ним.

Когда я добавляю dll и пытаюсь использовать функциив проекте консольного приложения win32 в визуальных студиях мне выдаётся ошибка компоновщика:

Ошибка 1, ошибка LNK2019: неразрешенный внешний символ _CAENVME_SWRelease @ 4, указанный в функции _main main.obj vmeTest

Который япредположим, означает, что он не может найти функцию CAENVME_SWRelease в dll.

Я добавил dll и соответствующий .lib к проекту вместе с заголовочными файлами и добавил их в ссылки (я пытался добавить их впеременная окружения пути и под компоновщиком в дополнительных каталогах библиотеки <- раньше делать этого не нужно, но я подумал, что попробую), но это просто не сработает. </p>

Чтобы узнать, не делал ли я это простоэто правильно, я попытался создать DLL и добавить его в проект таким же образом, и он отлично работает.

Так что мне было интересно, если это бпотому что я использую проект win32, и эти библиотеки являются 64-битными (потому что они для 64-битных драйверов?).

Очевидно, я не знаю, о чем говорю.Может ли кто-нибудь оказать мне какую-то помощь или получить представление о том, что может происходить?

Вот как определяется функция в заголовочном файле:

CAENVME_API
CAENVME_SWRelease(char *SwRel);

, и я назвал ее так:

char dog;
CAENVME_SWRelease(&dog);
cout << dog

Ответы [ 2 ]

1 голос
/ 01 июля 2010

В имени символа _CAENVME_SWRelease @ 4, @ 4 - это длина аргументов в стеке в байтах - 4 байта для 32-битного указателя. В 64-битной версии это будет 8 байт, и поэтому функция будет изменена на «@ 8», поэтому разрешение имен не удается.

[По крайней мере, 64-битный стандартный вызов будет поврежден так же, как 32-битный, но это не так. В любом случае теперь имеется достаточно регистров для передачи первых нескольких аргументов в регистрах, так что это не попадет в стек, и важно, чтобы вызывающая сторона и вызываемая сторона согласовали количество байтов в стеке, подлежащих очистке в stdcall (Callee очищает), так что это источник числа в искажении имени. Спасибо, Ганс!]

Но нет, даже если вы все сделаете правильно, вы не сможете связать 32-битный и 64-битный код вместе, как это. К сожалению.

В сторону: я подозреваю, что вы действительно хотите

char SwRel[256];
CAENVME_SWRelease(SwRel);

Я подозреваю, что он заполнит буфер строкой, а не вернет вам один символ. Однако на самом деле это не так, учитывая, что он не принимает параметр размера буфера, поэтому все, что вы можете сделать, - это целенаправленно нацеливаться на высокий размер буфера.

0 голосов
/ 01 июля 2010

В ваш проект вы должны добавить еще одну «цель», добавить x64, это поможет вам.

но у вас должно быть 64 бита всех библиотек, которые вы используете.

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

http://msdn.microsoft.com/en-us/library/aa384204.aspx

...