その行をC ++でどのように書くことができますか?
Delphiコード(ここに投稿されたこのコードではありません)を使用して、いくつかの情報で満たされたレコードをexeファイルに書き込み、C ++コードを使用して、このレコードを読み取り、情報を構造体に渡します
これはデルファイのコードです
type
TSettings = record
sFileName: String[50];
siInstallFolder: Byte;
bRunFile: Boolean;
...
end;
..
var
i: dword;
sZdData: PChar;
Settings :Tsettings;
begin
....
ZeroMemory(@Settings, sizeof(Tsettings));
settings := Tsettings(Pointer(@sZdData[i])^); // this code to c++
c++ コード (残りは問題ないことを願っています)
struct TSettings{
char sFileName[50];
byte siInstallFolder;
bool bRunFile;
...
} Settings;
...
DWORD i;
LPBYTE sZdData;
ZeroMemory(&Settings, sizeof(TSettings));
Settings = ????? // im failing here i dunno what to do // i need same as in delphi code above
私の悪い英語でごめんなさい.. :(
これはデルフィコードです
function GetInfoSettings(FileName: String; // filename from where to get data
var lpData: PChar; // where to write data
var dwSettingsLen: DWORD // returns the length of all bound files
): Boolean;
var
hFile: THandle;
DosHeader: TImageDosHeader;
NtHeaders: TImageNtHeaders;
SectionHeader: TImageSectionHeader;
dwReadBytes, dwOrginalFileSize, dwFileSize, dwSettingsLength: DWORD;
begin
Result := False;
hFile := Createfile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
SetFilePointer(hFile, 0, nil, FILE_BEGIN);
ReadFile(hFile, DosHeader, sizeof(DosHeader), dwReadBytes, nil);
if dwReadBytes = sizeof(DosHeader) then
begin
SetFilePointer(hFile, DosHeader._lfanew, nil, FILE_BEGIN);
ReadFile(hFile, NtHeaders, sizeof(NtHeaders), dwReadBytes, nil);
if dwReadBytes = sizeof(NtHeaders) then
begin
SetFilePointer(hFile, sizeof(SectionHeader) * (NtHeaders.FileHeader.NumberOfSections -1), nil, FILE_CURRENT);
ReadFile(hFile, SectionHeader, sizeof(SectionHeader), dwReadBytes, nil);
dwOrginalFileSize := SectionHeader.PointerToRawData + SectionHeader.SizeOfRawData;
dwFileSize := GetFileSize(hFile, nil);
dwSettingsLength := dwFileSize - dwOrginalFileSize;
if dwSettingsLength > 0 then
begin
SetFilePointer(hFile, dwOrginalFileSize, nil, FILE_BEGIN);
GetMem(lpData, dwSettingsLength);
ReadFile(hFile, lpData^, dwSettingsLength, dwReadBytes, nil);
if dwReadBytes = dwSettingsLength then
begin
Result := True;
dwSettingsLen := dwSettingsLength;
end;
end;
end;
end;
CloseHandle(hFile);
end;
ここで、情報またはバインドされたファイルを取得します...
var i, // 既に完了したバイト数が保存されます.. dwDaSize: DWORD; // すべてのセクションの後のデータの長さ .. dwFilenaam,sFileName :string; sZdData: PChar; // ここでは、"EOF" (すべてのセクション データの終わり) の後のすべてのデータになります // ファイルが抽出されるファイル名 ..
Settings: Tsettings;
// writting
hFile: THandle;
lpNumberOfBytesWritten: DWORD;
begin
GetMem(dwFilenaam, MAX_PATH);
GetModuleFileName(GetModuleHandle(nil), dwFilenaam, MAX_PATH);
if GetInfos(dwFilenaam, sZdData, dwDaSize) then
begin
i := 0;
repeat
ZeroMemory(@Settings, sizeof(Tsettings));
settings := Tsettings(Pointer(@sZdData[i])^);
私の試み(私はこのコードがゴミLOLに見えることを知っています)多分そうではありませんか?
bool getSettingsInfo(LPSTR FileName, LPBYTE lpdata, DWORD dwSettingsLen)
{
HANDLE HandleFile ;
DWORD dwReadBytes;
DWORD dwOrginalFileSize;
DWORD dwFileSize;
DWORD dwSettingsLength;
PIMAGE_DOS_HEADER pidh ;
PIMAGE_NT_HEADERS pinh ;
PIMAGE_SECTION_HEADER pish;
return false;
HandleFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0,OPEN_EXISTING,0, NULL);
SetFilePointer(HandleFile, 0,0, FILE_BEGIN);
ReadFile(HandleFile, pidh, sizeof(pidh), &dwReadBytes,NULL);
if (dwReadBytes == sizeof(pidh))
{
SetFilePointer(HandleFile, pidh->e_lfanew , NULL, FILE_BEGIN);
ReadFile(HandleFile, pidh,sizeof(pinh), &dwReadBytes, NULL);
if (dwReadBytes == sizeof(pinh))
{
SetFilePointer(HandleFile, sizeof(pish) * (pinh->FileHeader.NumberOfSections -1), NULL, FILE_CURRENT);
ReadFile(HandleFile, pish, sizeof(pinh), &dwReadBytes, NULL);
dwOrginalFileSize = pish->PointerToRawData + pish->SizeOfRawData;
dwFileSize = GetFileSize(HandleFile, NULL);
dwSettingsLength = dwFileSize - dwOrginalFileSize;
if (dwSettingsLength > 0)
{
SetFilePointer(HandleFile, dwOrginalFileSize, NULL, FILE_BEGIN);
realloc(lpdata, dwSettingsLength);
ReadFile(HandleFile, lpdata, dwSettingsLength, &dwReadBytes, NULL);
if (dwReadBytes == dwSettingsLength)
{
return true;
dwSettingsLen = dwSettingsLength;
}
}
}
}
CloseHandle(HandleFile);
}
情報を抽出するコード ...
DWORD i; // here will be saved how much bytes are already done ..
DWORD dwDaSize; // length of data after all sections ..
LPSTR dwFilenaam;
LPBYTE sZdData; // here will be all data after "EOF" (End of all sections data)
LPSTR sFileName;// the filename where the file will be extracted ..
char * Installpath;
char * buffer;
HFILE hFile;
DWORD lpNumberOfBytesWritten;
memset(dwFilenaam,0, MAX_PATH);
GetModuleFileName(GetModuleHandle(NULL), dwFilenaam, MAX_PATH);
if (getSettingsInfo(dwFilenaam, sZdData, dwDaSize) == true)
{
i = 0;
// REPEAT
ZeroMemory(&Settings, sizeof(TSettings));
Settings = ???