Страница 1 из 1

Компиляция плагинов в MinGW

Добавлено: Вс апр 12, 2009 11:44
tmp
Здравствуйте. Я пишу небольшой FS-плагин для TC. Компилирую в MinGW. Проблема в том, что после выхода из FsFindClose, TC выдает окно "Access violation at address 005e4416. Read of address xxxx", причем xxxx зависит от значения HANDLE, возвращенного FsFindFirst.
Код, из которого я убрал практически всё, тоже выдает ошибку:

plugin.h

Код: Выделить всё

#include <windows.h>

#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#else
/* EXE import */
#define EXPORT __declspec(dllimport)
#endif

typedef struct {
    DWORD SizeLow,SizeHigh;
    FILETIME LastWriteTime;
    int Attr;
} RemoteInfoStruct;

typedef struct {
	int size;
	DWORD PluginInterfaceVersionLow;
	DWORD PluginInterfaceVersionHi;
	char DefaultIniName[MAX_PATH];
} FsDefaultParamStruct;

// callback functions
typedef int *tProgressProc(int PluginNr,char* SourceName,
             char* TargetName,int PercentDone);
typedef void *tLogProc(int PluginNr,int MsgType,char* LogString);
typedef BOOL *tRequestProc(int PluginNr,int RequestType,char* CustomTitle,
              char* CustomText,char* ReturnedText,int maxlen);

// Function prototypes
extern "C"
{
int FsInit(int PluginNr,tProgressProc pProgressProc,
                     tLogProc pLogProc,tRequestProc pRequestProc);
HANDLE FsFindFirst(char* Path,WIN32_FIND_DATA *FindData);
BOOL  FsFindNext(HANDLE Hdl,WIN32_FIND_DATA *FindData);
int  FsFindClose(HANDLE Hdl);
}
plugin.c

Код: Выделить всё

#include <plugin.h>

EXPORT int FsInit(int PluginNr, tProgressProc pProgressProc,
                     tLogProc pLogProc, tRequestProc pRequestProc)
{
    return 0;
}

EXPORT HANDLE FsFindFirst(char* Path, WIN32_FIND_DATA *FindData)
{
    return (HANDLE)0; //Здесь может быть указатель или любое другое число
}

EXPORT BOOL FsFindNext(HANDLE Hdl, WIN32_FIND_DATA *FindData)
{
    return 0;
}

EXPORT int FsFindClose(HANDLE Hdl)
{
    return 0;
}
При компиляции в MSVC никаких проблем нет. Как откомпилировать плагин в MinGW?

Добавлено: Вс апр 12, 2009 17:22
VadiMGP
Сроду не пользовался MinGW, поэтому чисто фантазирую.
Возможно, для MinGW надо явно прописать _stdcall.

Добавлено: Вс апр 12, 2009 17:35
tmp
Если дописать __stdcall, то создаются функции с именами вроде FsInit@16 вместо FsInit. Вероятно, это можно убрать параметрами командной строки, но линкер игнорирует --kill-at

Добавлено: Вс апр 12, 2009 17:40
VadiMGP
Имена экспортируемых функций укажи в файле .def

Добавлено: Вс апр 12, 2009 18:05
tmp
Случайно решил проблему добавлением правильного ключа линковщику: -Wl,--kill-at
Всем спасибо.