Компиляция плагинов в MinGW
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Написание плагинов для Total Commander

#1: Компиляция плагинов в MinGW Author: tmp PostPosted: Sun Apr 12, 2009 11:44
    —
Здравствуйте. Я пишу небольшой 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?

#2:  Author: VadiMGP PostPosted: Sun Apr 12, 2009 17:22
    —
Сроду не пользовался MinGW, поэтому чисто фантазирую.
Возможно, для MinGW надо явно прописать _stdcall.

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

#4:  Author: VadiMGP PostPosted: Sun Apr 12, 2009 17:40
    —
Имена экспортируемых функций укажи в файле .def

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



Total Commander -> Написание плагинов для Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group