View previous topic :: View next topic |
Author |
Message |
tmp
Joined: 12 Apr 2009 Posts: 3
|
(Separately) Posted: Sun Apr 12, 2009 11:44 Post subject: Компиляция плагинов в MinGW |
|
|
Здравствуйте. Я пишу небольшой FS-плагин для TC. Компилирую в MinGW. Проблема в том, что после выхода из FsFindClose, TC выдает окно "Access violation at address 005e4416. Read of address xxxx", причем xxxx зависит от значения HANDLE, возвращенного FsFindFirst.
Код, из которого я убрал практически всё, тоже выдает ошибку:
plugin.h
Code: |
#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
Code: |
#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? |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sun Apr 12, 2009 17:22 Post subject: |
|
|
Сроду не пользовался MinGW, поэтому чисто фантазирую.
Возможно, для MinGW надо явно прописать _stdcall. |
|
Back to top |
|
|
tmp
Joined: 12 Apr 2009 Posts: 3
|
(Separately) Posted: Sun Apr 12, 2009 17:35 Post subject: |
|
|
Если дописать __stdcall, то создаются функции с именами вроде FsInit@16 вместо FsInit. Вероятно, это можно убрать параметрами командной строки, но линкер игнорирует --kill-at |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sun Apr 12, 2009 17:40 Post subject: |
|
|
Имена экспортируемых функций укажи в файле .def |
|
Back to top |
|
|
tmp
Joined: 12 Apr 2009 Posts: 3
|
(Separately) Posted: Sun Apr 12, 2009 18:05 Post subject: |
|
|
Случайно решил проблему добавлением правильного ключа линковщику: -Wl,--kill-at
Всем спасибо. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|