Импорт dll, и работа с ней.

Всем привет. У меня такая ситуация: Есть файл в формате .vfs в нём определлённым способом зжаты файлы игры. Есть длл, которая обеспечивает общение между этим так называемым архивом и исполняемыми программами. Вот есть исходный код программы на c++ для работы с vfs. Мне нужно реализовать функцию AddFile и Remove file. Ниже код как я пытался делать.И ошибка которая выскакивает.Исходник c++
VFS editor source/* TriggerVFS.hpp CTriggerVfs Class that fully implements the use of TriggerVFS.dll Written by iddqd42 iddqd42 (at) gmail (dot) com */ #ifndef IDDQD_CODE #define IDDQD_CODE #endif #ifndef TRIGGER_VFS_DEF #define TRIGGER_VFS_DEF #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <iostream> #include <string> #include <vector> #include <list> #include <algorithm> #include <cstdio> typedef DWORD INDEXHANDLE; typedef DWORD FILEHANDLE; struct FileInfo { int attribute; int checksum; }; struct FileTree { DWORD filecount; char **files; }; class CTriggerVFS { typedef INDEXHANDLE (__stdcall *EXPORT_OpenVFS) (const char *idxfile, const char *mode); typedef DWORD (__stdcall *EXPORT_CloseVFS) (INDEXHANDLE handle); typedef DWORD (__stdcall *EXPORT_VGetVfsCount) (INDEXHANDLE handle); typedef void (__stdcall *EXPORT_VGetVfsNames) (INDEXHANDLE handle, char **names, DWORD maxcount, DWORD maxlen); typedef DWORD (__stdcall *EXPORT_VGetFileCount) (INDEXHANDLE handle, const char *vfsfile); typedef void (__stdcall *EXPORT_VGetFileNames) (INDEXHANDLE handle, const char *name, char **files, DWORD &maxfiles, DWORD maxlen); typedef void (__stdcall *EXPORT_VGetFileInfo) (INDEXHANDLE handle, const char *filename, FileInfo *info, DWORD somehandle); typedef DWORD (__stdcall *EXPORT_VAddFile) (INDEXHANDLE handle, const char *insertvfs, const char *localpath, const char *vfspath, DWORD attribute, DWORD checksum, DWORD reserved, DWORD reserved2, DWORD reserved3);typedef DWORD (__stdcall *EXPORT_VFileExists) (INDEXHANDLE handle, const char *filename); typedef DWORD (__stdcall *EXPORT_VRemoveFile) (INDEXHANDLE handle, const char *filename); typedef WORD (__stdcall *EXPORT_VGetError) (); typedef DWORD (__stdcall *EXPORT_VGetTotFileCount)(INDEXHANDLE handle); typedef DWORD (__stdcall *EXPORT_VGetCurVersion) (INDEXHANDLE handle); typedef DWORD (__stdcall *EXPORT_VAddVfs) (INDEXHANDLE handle, const char *vfsname); typedef FILEHANDLE (__stdcall *EXPORT_VOpenFile) (const char *path, INDEXHANDLE handle); typedef void (__stdcall *EXPORT_VCloseFile) (FILEHANDLE handle); typedef DWORD (__stdcall *EXPORT_VFGetSize) (FILEHANDLE handle); typedef DWORD (__stdcall *EXPORT_VFRead) (void *buffer, DWORD size, DWORD count, FILEHANDLE handle); public: CTriggerVFS(HMODULE dll) : hDll(dll) { vfsnames = 0; vfscount = 0; handle = 0; tree = 0; pOpenVFS = (EXPORT_OpenVFS) GetProcAddress(hDll, "_OpenVFS@8"); pCloseVFS = (EXPORT_CloseVFS) GetProcAddress(hDll, "_CloseVFS@4"); pGetVfsCount = (EXPORT_VGetVfsCount) GetProcAddress(hDll, "_VGetVfsCount@4"); pGetVfsNames = (EXPORT_VGetVfsNames) GetProcAddress(hDll, "_VGetVfsNames@16"); pGetFileCount = (EXPORT_VGetFileCount) GetProcAddress(hDll, "_VGetFileCount@8"); pGetFileNames = (EXPORT_VGetFileNames) GetProcAddress(hDll, "_VGetFileNames@20"); pAddFile = (EXPORT_VAddFile) GetProcAddress(hDll, "_VAddFile@36"); pGetFileInfo = (EXPORT_VGetFileInfo) GetProcAddress(hDll, "_VGetFileInfo@16"); pFileExists = (EXPORT_VFileExists) GetProcAddress(hDll, "_VFileExists@8"); pRemoveFile = (EXPORT_VRemoveFile) GetProcAddress(hDll, "_VRemoveFile@8"); pGetError = (EXPORT_VGetError) GetProcAddress(hDll, "_VGetError@0"); pGetTotalFileCount = (EXPORT_VGetTotFileCount) GetProcAddress(hDll, "_VGetTotFileCount@4"); pGetCurVersion = (EXPORT_VGetCurVersion) GetProcAddress(hDll, "_VGetCurVersion@4"); pOpenFile = (EXPORT_VOpenFile) GetProcAddress(hDll, "_VOpenFile@8"); pCloseFile = (EXPORT_VCloseFile) GetProcAddress(hDll, "_VCloseFile@4"); pGetFileSize = (EXPORT_VFGetSize) GetProcAddress(hDll, "_vfgetsize@4"); pReadFile = (EXPORT_VFRead) GetProcAddress(hDll, "_vfread@16"); pAddVfs = (EXPORT_VAddVfs) GetProcAddress(hDll, "_VAddVfs@8"); } bool openIndex(const std::string &indexfile, bool readonly) { std::string mode; mode = readonly ? "r" : "r+"; handle = pOpenVFS(indexfile.c_str(), mode.c_str()); vfscount = pGetVfsCount(handle); vfsnames = new char *[vfscount]; for(int i = 0; i < vfscount; i++) vfsnames = new char [MAX_PATH]; pGetVfsNames(handle, vfsnames, vfscount, MAX_PATH); vfscount--; // Remove the damned ROOT.VFS return (handle != 0); } DWORD buildFileTree() { DWORD totalfiles = 0; if(tree) { for(int ivfs = 0; ivfs < vfscount; ivfs++) { for(int ifile = 0; ifile < tree[ivfs].filecount; ifile++) delete [] tree[ivfs].files[ifile]; delete [] tree[ivfs].files; } delete [] tree; tree = 0; } for(int i = 0; i < vfscount; i++) delete [] vfsnames; delete [] vfsnames; vfscount = pGetVfsCount(handle); vfsnames = new char *[vfscount]; for(int i = 0; i < vfscount; i++) vfsnames = new char [MAX_PATH]; pGetVfsNames(handle, vfsnames, vfscount, MAX_PATH); vfscount--; // Remove the damned ROOT.VFS tree = new FileTree[vfscount]; for(int ivfs = 0; ivfs < vfscount; ivfs++) { tree[ivfs].filecount = pGetFileCount(handle, vfsnames[ivfs]); tree[ivfs].files = new char *[tree[ivfs].filecount]; for(int ifile = 0; ifile < tree[ivfs].filecount; ifile++) tree[ivfs].files[ifile] = new char[MAX_PATH]; pGetFileNames(handle, vfsnames[ivfs], tree[ivfs].files, tree[ivfs].filecount, MAX_PATH); totalfiles += tree[ivfs].filecount; } return totalfiles; } DWORD getCurrentVersion() const { return pGetCurVersion(handle); } DWORD getTotalFileCount() const { return pGetTotalFileCount(handle); } DWORD getVfsCount() const { return vfscount; } void getVfsNames(std::vector<std::string> &vf) { vf.clear(); for(int i = 0; i < vfscount; i++) vf.push_back(vfsnames); } bool getFileInfo(const std::string &filename, FileInfo *info) { DWORD somehandle = pFileExists(handle, filename.c_str()); if(somehandle & 0xFF) { pGetFileInfo(handle, filename.c_str(), info, somehandle); return true; } return false; } DWORD getVfsArchive(const std::string &filename, std::string &invfs) { for(int i = 0; i < vfscount; i++) { for(int ifile = 0; ifile < tree.filecount; ifile++) { if(filename == tree.files[ifile]) { invfs.assign(vfsnames); return i; } } } invfs.clear(); return -1; } bool addVfs(const std::string &vfsname, bool create = false) { FILE *excist = fopen(vfsname.c_str(), "r"); if(excist == NULL) { if(create) excist = fopen(vfsname.c_str(), "w"); if(excist == NULL) return false; } fclose(excist); return (bool)(pAddVfs(handle, vfsname.c_str())); } DWORD addFile(const std::string &localpath, const std::string &vfspath, const std::string &tovfs) { FileInfo info; if(getFileInfo(vfspath, &info)) removeFile(vfspath); info.attribute = 0x64; // Meh, it works fine;) info.checksum = 0; return pAddFile(handle, tovfs.c_str(), localpath.c_str(), vfspath.c_str(), info.attribute, info.checksum, 0, 0, 0); } WORD getLastError() { return pGetError(); } bool removeFile(const std::string &vfspath) const { return !pRemoveFile(handle, vfspath.c_str()); } FileTree *getFileTree() const { return tree; } DWORD getFileSize(const std::string &filename) { FILEHANDLE h = pOpenFile(filename.c_str(), handle); DWORD size = pGetFileSize(h); pCloseFile(h); return size; } bool extractFile(const std::string &filename, const char *localfile = NULL) { FILE *out; FILEHANDLE in; bool allok = true; std::string writeto; if(filename.empty()) return false; if(!localfile) { int pos = filename.find_last_of("\\"); pos = (pos == -1) ? 0 : pos; writeto.assign(filename.substr(pos + 1)); } else { writeto.assign(localfile); } if(!(in = pOpenFile(filename.c_str(), handle))) return false; DWORD size = pGetFileSize(in); char *buffer = new char[size]; if(pReadFile(buffer, 1, size, in) == size) { pCloseFile(in); if((out = fopen(writeto.c_str(), "wb")) == NULL) allok = false; else { if(fwrite(buffer, 1, size, out) != size) allok = false; fclose(out); } delete [] buffer; } else allok = false; return allok; } void closeIndex() { pCloseVFS(handle); handle = 0; } ~CTriggerVFS() { if(vfsnames) { for(int i = 0; i < vfscount; i++) delete [] vfsnames; delete [] vfsnames; } if(tree) { for(int i = 0; i < vfscount; i++) { for(int ifile = 0; ifile < tree.filecount; ifile++) delete [] tree.files[ifile]; delete [] tree.files; } delete [] tree; } } private: FileTree *tree; DWORD vfscount; char **vfsnames; INDEXHANDLE handle; EXPORT_OpenVFS pOpenVFS; EXPORT_CloseVFS pCloseVFS; EXPORT_VGetVfsCount pGetVfsCount; EXPORT_VGetVfsNames pGetVfsNames; EXPORT_VGetFileCount pGetFileCount; EXPORT_VGetFileNames pGetFileNames; EXPORT_VAddFile pAddFile; EXPORT_VRemoveFile pRemoveFile; EXPORT_VGetFileInfo pGetFileInfo; EXPORT_VFileExists pFileExists; EXPORT_VGetError pGetError; EXPORT_VGetTotFileCount pGetTotalFileCount; EXPORT_VGetCurVersion pGetCurVersion; EXPORT_VOpenFile pOpenFile; EXPORT_VCloseFile pCloseFile; EXPORT_VFGetSize pGetFileSize; EXPORT_VFRead pReadFile; EXPORT_VAddVfs pAddVfs; HMODULE hDll; }; #endif
Моё
function VAddFile(strInsertVfs,strLocalPath,strVfsPath: string):string;external 'TriggerVFS.dll' name '_VAddFile@36'; //импорт по имениprocedure TForm1.Button1Click(Sender: TObject);var t:string;begint:=VAddFile('3ddata.vfs','1.txt','stb/');showmessage(t);end;
Вот тут сама длл. Скачать
3 ответа

хоть убей не понимаю как вы из этих кусков кода:
...typedef DWORD (__stdcall *EXPORT_VAddFile) (INDEXHANDLE handle, const char *insertvfs, const char *localpath, const char *vfspath, DWORD attribute, DWORD checksum, DWORD reserved, DWORD reserved2, DWORD reserved3);...pAddFile = (EXPORT_VAddFile) GetProcAddress(hDll, "_VAddFile@36"); ...DWORD addFile(const std::string &localpath, const std::string &vfspath, const std::string &tovfs) { FileInfo info; if(getFileInfo(vfspath, &info)) removeFile(vfspath); info.attribute = 0x64; // Meh, it works fine;) info.checksum = 0; return pAddFile(handle, tovfs.c_str(), localpath.c_str(), vfspath.c_str(), info.attribute, info.checksum, 0, 0, 0); } 
получили то что получили, вместо чего то такого:
function VAddFile(handle: INDEXHANDLE; insertvfs, localpath, vfspath: PAnsiChar; attribute, checksum, reserved, reserved2, reserved3: Cardinal): Cardinal; stdcall; external 'TriggerVFS.dll' name '_VAddFile@36'; //импорт по имениfunction addFile(localpath, vfspath, tovfs: PAnsiChar): Cardinal;begin   if FileExists(vfspath) then DeleteFile(vfspath);  handle:=???? // надо получить через OpenVFS полагаю  Result:=VAddFile(handle, tovfs, localpath, vfspath, $64, 0, 0, 0, 0); end;procedure TForm1.Button1Click(Sender: TObject);var t:string;begin  t:=addFile('stb/','3ddata.vfs','1.txt');  showmessage(t);end;


Может кто поможет с полной реализацией функций?Тип INDEXHANDLE не может найти чем предлагаете заменить Thandle ?
  if FileExists(vfspath) then DeleteFile(vfspath);
Это условие не верное. Файл .vfs он как архив содержит внутри много файлов, мне нужно функции на добавления файлов в этот архив, и на удаление файлов из архива. Мне нужна помощь с функциями, так как с длл вообще не представляю как работать:( Пока важна реализация на 1 файл,  на остальные допишу сам.


Спасибо xkor , со всем разобрался. Тему можно удалить или зарыть.