Wie kann ich diese Zeile in C++ schreiben?Konvertieren Sie eine Delphi-Code-Zeile in C++
mit delphi-Code (Code nicht hier gepostet) Ich werde diesen Rekord mit ein paar Informationen gefüllt Datei schreiben und mit C++ Code exe wird i thhis Datensatz gelesen und die Informationen auf die Struktur übergeben
Dies ist der Code in delphi
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++ Code (hoffe, der Rest ist OK)
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
und sory für mein schlechtes Englisch .. :(
Dies ist der delphi Code
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;
und hier ich die Informationen oder die binded Datei bekommen ...
var i //, werden hier gespeichert werden, wie viel Bytes sind bereits getan .. dwDaSize: DWORD; // Länge der Daten nach allen Abschnitten .. dwFilenaam, sFileName: string; sZdData: PChar; vielleicht // hier werden alle Daten nach dem „EOF“ (Ende aller Abschnitte Daten) // der Dateiname sein, in dem die Datei extrahiert werden ..
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])^);
mein Versuch (ich weiß, dass dieser Code sieht Müll LOL) nicht?
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);
}
Code zu extrahieren info ...
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 = ???
Delphi kurze Zeichenfolge (Zeichenfolge [50]) ist 51 Byte groß, da sFileName [0] die Länge der Zeichenfolge enthält. –
+1 für den funky Code. –
Sie müssen etwas von dem Code, den Sie weggelassen haben, mit '...' posten. Irgendwo wurde Inhalt mit einer Zuweisung zu "sZdData" zugewiesen, und in diesem fehlenden Code sind weitere Informationen verfügbar. –