Имеет ли смысл тип функции "extern __declspec (dllimport) INT __cdecl" в C / C ++ или SWIG? - PullRequest
0 голосов
/ 21 июля 2010

Я пытаюсь обернуть DLL, используя файл заголовка, через SWIG. Я получил синтаксическую ошибку при обработке файла интерфейса .i с помощью SWIG. После отслеживания, что было ошибочной строкой (номер строки напечатанного SWIG сообщения об ошибке не соответствовал истинной ошибочной строке), я обнаружил, что минимальный необработанный интерфейсный файл SWIG:

/* example.i */
%module example
%{
extern  __declspec(dllimport) INT __cdecl function(int argument);
%}
extern  __declspec(dllimport) INT __cdecl function(int argument);

Где прототип крачки extern __declspec(dllimport) INT __cdecl function(int argument); был получен из заголовочного файла, который я пытался обернуть.

Десятки функций объявлены с этим типом. Как вы видите, у меня недостаточно опыта C, чтобы понять, имеет ли этот тип смысл. Заголовочный файл был получен от поставщика и он компилируется нормально, используя Visual C ++ 6. Может кто-нибудь уточнить меня?

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

ОК ... в итоге узнал, что такое соглашения о вызовах. Проблема заключалась в том, как должен быть записан файл интерфейса SWIG.

/* example.i */
%module example
%{
int __cdecl foo(void);      // function declarations for the function 
int __stdcall foo2(void);   // you intend to wrap goes in here
%}
int foo(void);          // function you want to wrap goes in here
int foo2(void);         // without the calling convention

В той области, куда идет функция, которую вы хотите обернуть, не должно содержаться модификатор соглашения о вызовах (__cdecl, __stdcall и т. Д.). Но я не хотел удалять модификаторы соглашения о вызовах вручную, особенно потому, что я не хотел изменять заголовочный файл, который я пытался обернуть (представьте, что поставщик выпускает новую и несовместимую версию файла заголовка, мне придется изменить заголовок все снова). Решение состоит в том, чтобы # определить модификаторы соглашения о вызовах, SWIG уже предоставляет файл, который содержит этот # define'tions, "windows.i". Вы просто должны включить его, прежде чем включать заголовок, содержащий функции, которые вы хотите обернуть. Как это:

/* example.i */
%module example
%{
#include "example.h"
%}
%include "windows.i"
%include "example.h"

, где

/* example.h */
int __cdecl foo(void);
int __stdcall foo2(void);

Я просто не понимаю, почему он не делает этого по умолчанию. Но я доволен тем, что нашел. Спасибо, ребята за указатели ...

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

Просто INT выскакивает как проблема. Это макрос, вам нужно набрать #include <windows.h>, чтобы определить его. Это очень вряд ли что-то еще, кроме обычного int. «Extern» излишен, любой компилятор проигнорирует его.

...