ОК ... в итоге узнал, что такое соглашения о вызовах. Проблема заключалась в том, как должен быть записан файл интерфейса 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);
Я просто не понимаю, почему он не делает этого по умолчанию. Но я доволен тем, что нашел. Спасибо, ребята за указатели ...