Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Импорт dll, и работа с ней. 
:(
    Опции темы
Tosik
Дата 31.8.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Всем привет. У меня такая ситуация: Есть файл в формате .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;
begin
t:=VAddFile('3ddata.vfs','1.txt','stb/');
showmessage(t);
end;

user posted image
Вот тут сама длл. Скачать



Это сообщение отредактировал(а) Tosik - 31.8.2010, 18:56
PM MAIL   Вверх
xkor
Дата 31.8.2010, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.1.2007
Где: Питер

Репутация: 2
Всего: 4



хоть убей не понимаю как вы из этих кусков кода:
Код

...
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;

PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Tosik
Дата 1.9.2010, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Может кто поможет с полной реализацией функций?
Тип INDEXHANDLE не может найти чем предлагаете заменить Thandle ?
Код

  if FileExists(vfspath) then DeleteFile(vfspath);

Это условие не верное. 

Файл .vfs он как архив содержит внутри много файлов, мне нужно функции на добавления файлов в этот архив, и на удаление файлов из архива. Мне нужна помощь с функциями, так как с длл вообще не представляю как работать:( Пока важна реализация на 1 файл,  на остальные допишу сам.

Это сообщение отредактировал(а) Tosik - 1.9.2010, 08:43
PM MAIL   Вверх
Tosik
Дата 2.9.2010, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Спасибо xkor , со всем разобрался. Тему можно удалить или зарыть.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1186 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.