* PageEx - every page can be used everywhere and as many times as needed
* DirVar - easy way to add another dir page * default strings in the language file (Page directory is enough, no need for DirText) * strings from the language file are now LangStrings that can be used in the script * no more /LANG - one string for all languages * any lang strings can be used everywhere, installer or uninstaller (no un.) * no more unprocessed strings - variables can be used almost everywhere (except in licenseData and InstallDirRegKey) * DirText parm for browse dialog text * SetBkColor -> SetCtlColors - can now set text color too * fixed SetOutPath and File /r bug * fixed File /a /oname bug * added $_CLICK for pages * added quotes support in lang files (patch #752620) * extraction progress * separate RTL dialogs for RTL langs (improved RTL too) * InstallOptions RTL * StartMenu RTL * fixed RegDLL? * added IfSilent and SetSilent (SetSilent only works from .onInit) * fixed verify window (it never showed) (bug #792494) * fixed ifnewer readonly file problem (patch #783782) * fixed wininit.ini manipulation when there is another section after [rename] * fixed some ClearType issues * fixed a minor bug in the resource editor * fixed !ifdef/!endif stuff, rewritten * lots of code and comments clean ups * got rid of some useless exceptions handling and STL classes (still much more to go) * lots of optimizations, of course ;) * updated system.dll with support for GUID, WCHAR, and fast VTable calling (i.e. COM ready) * minor bug fixes git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2823 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
bb8879b7ae
commit
74ea2dc585
91 changed files with 5180 additions and 4101 deletions
|
@ -17,11 +17,12 @@
|
|||
#define PCD_PARAMS 2
|
||||
#define PCD_DONE 3 // Just Continue
|
||||
|
||||
int ParamSizeByType[6] = {0, // PAT_VOID (Size will be equal to 1)
|
||||
int ParamSizeByType[7] = {0, // PAT_VOID (Size will be equal to 1)
|
||||
1, // PAT_INT
|
||||
2, // PAT_LONG
|
||||
1, // PAT_STRING
|
||||
1, // PAT_BOOLEAN
|
||||
1, // PAT_WSTRING
|
||||
1, // PAT_GUID
|
||||
0}; // PAT_CALLBACK (Size will be equal to 1)
|
||||
|
||||
int z1, z2; // I've made them static for easier use at callback procs
|
||||
|
@ -36,7 +37,6 @@ HINSTANCE g_hInstance;
|
|||
char retexpr[3] = {0xC2, 0x00, 0x00};
|
||||
HANDLE retaddr;
|
||||
|
||||
|
||||
char *GetResultStr(SystemProc *proc)
|
||||
{
|
||||
char *buf = AllocString();
|
||||
|
@ -180,6 +180,7 @@ PLUGINFUNCTION(Call)
|
|||
proc = CallBack(proc);
|
||||
break;
|
||||
case PT_PROC:
|
||||
case PT_VTABLEPROC:
|
||||
proc = CallProc(proc); break;
|
||||
case PT_STRUCT:
|
||||
CallStruct(proc); break;
|
||||
|
@ -253,7 +254,8 @@ PLUGINFUNCTIONSHORT(Int64Op)
|
|||
case '%':
|
||||
// It's unclear, but in this case compiler will use DivMod rountine
|
||||
// instead of two separate Div and Mod rountines.
|
||||
i3 = i1 / i2; i4 = i1 % i2;
|
||||
if (i2 == 0) { i3 = 0; i4 = i1; }
|
||||
else {i3 = i1 / i2; i4 = i1 % i2; }
|
||||
if (*op == '/') i1 = i3; else i1 = i4;
|
||||
break;
|
||||
case '|': if (op[1] == '|') i1 = i1 || i2; else i1 |= i2; break;
|
||||
|
@ -306,7 +308,12 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
|||
{
|
||||
case 0x0: SectionType = -1; break;
|
||||
case '#': SectionType = PST_PROC; ProcType = PT_NOTHING; break;
|
||||
case '(': SectionType = PST_PARAMS; ParamIndex = 1; temp3 = temp = 0; break;
|
||||
case '(':
|
||||
SectionType = PST_PARAMS;
|
||||
// fake-real parameter: for COM interfaces first param is Interface Pointer
|
||||
ParamIndex = ((ProcType == PT_VTABLEPROC)?(2):(1));
|
||||
temp3 = temp = 0;
|
||||
break;
|
||||
case ')': SectionType = PST_RETURN; temp3 = temp = 0; break;
|
||||
case '?': SectionType = PST_OPTIONS; temp = 1; break;
|
||||
}
|
||||
|
@ -364,6 +371,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
|||
}
|
||||
break;
|
||||
case PT_PROC:
|
||||
case PT_VTABLEPROC:
|
||||
lstrcpy(proc->ProcName, cbuf);
|
||||
lstrcpy(proc->DllName, sbuf);
|
||||
break;
|
||||
|
@ -389,8 +397,16 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
|||
switch (*ib)
|
||||
{
|
||||
case ':':
|
||||
case '-':
|
||||
// Is it '::'
|
||||
if (*(ib+1) != ':') break;
|
||||
if ((*(ib) == '-') && (*(ib+1) == '>'))
|
||||
{
|
||||
ProcType = PT_VTABLEPROC;
|
||||
} else
|
||||
{
|
||||
if ((*(ib+1) != ':') || (*(ib) == '-')) break;
|
||||
ProcType = PT_PROC;
|
||||
}
|
||||
ib++; // Skip next ':'
|
||||
|
||||
if (cb > cbuf)
|
||||
|
@ -400,7 +416,6 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
|||
} else *sbuf = 0; // No dll - system proc
|
||||
|
||||
// Ok
|
||||
ProcType = PT_PROC;
|
||||
ChangesDone = PCD_DONE;
|
||||
break;
|
||||
case '*':
|
||||
|
@ -442,8 +457,10 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
|||
case 'L': temp2 = PAT_LONG; break;
|
||||
case 't':
|
||||
case 'T': temp2 = PAT_STRING; break;
|
||||
case 'b':
|
||||
case 'B': temp2 = PAT_BOOLEAN; break;
|
||||
case 'g':
|
||||
case 'G': temp2 = PAT_GUID; break;
|
||||
case 'w':
|
||||
case 'W': temp2 = PAT_WSTRING; break;
|
||||
case 'k':
|
||||
case 'K': temp2 = PAT_CALLBACK; break;
|
||||
|
||||
|
@ -589,6 +606,32 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
|||
switch (proc->ProcType)
|
||||
{
|
||||
case PT_NOTHING: break;
|
||||
case PT_VTABLEPROC:
|
||||
{
|
||||
// Use direct system proc address
|
||||
int addr;
|
||||
|
||||
if ((proc->Dll = addr = (HANDLE) myatoi(proc->DllName)) == 0)
|
||||
{
|
||||
proc->ProcResult = PR_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
// fake-real parameter: for COM interfaces first param is Interface Pointer
|
||||
proc->Params[1].Output = IOT_NONE;
|
||||
proc->Params[1].Input = AllocStr(proc->DllName);
|
||||
proc->Params[1].Size = 1;
|
||||
proc->Params[1].Type = PAT_INT;
|
||||
proc->Params[1].Option = 0;
|
||||
|
||||
// addr - pointer to interface vtable
|
||||
addr = *((int *)addr);
|
||||
// now addr contains the pointer to first item at VTABLE
|
||||
// add the index of proc
|
||||
addr = addr + (myatoi(proc->ProcName)*4);
|
||||
proc->Proc = *((HANDLE*)addr);
|
||||
}
|
||||
break;
|
||||
case PT_PROC:
|
||||
if (*proc->DllName == 0)
|
||||
{
|
||||
|
@ -607,7 +650,12 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
|||
|
||||
// Get proc address
|
||||
if ((proc->Proc = GetProcAddress(proc->Dll, proc->ProcName)) == NULL)
|
||||
proc->ProcResult = PR_ERROR;
|
||||
{
|
||||
// automatic A discover
|
||||
lstrcat(proc->ProcName, "A");
|
||||
if ((proc->Proc = GetProcAddress(proc->Dll, proc->ProcName)) == NULL)
|
||||
proc->ProcResult = PR_ERROR;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PT_STRUCT:
|
||||
|
@ -634,6 +682,7 @@ void ParamsIn(SystemProc *proc)
|
|||
{
|
||||
int i, *place;
|
||||
char *realbuf;
|
||||
LPWSTR wstr;
|
||||
|
||||
i = (proc->ParamCount > 0)?(1):(0);
|
||||
while (TRUE)
|
||||
|
@ -654,7 +703,10 @@ void ParamsIn(SystemProc *proc)
|
|||
// Retreive pointer to place
|
||||
if (proc->Params[i].Option == -1) place = (int*) proc->Params[i].Value;
|
||||
else place = (int*) &(proc->Params[i].Value);
|
||||
|
||||
|
||||
// by default no blocks are allocated
|
||||
proc->Params[i].allocatedBlock = NULL;
|
||||
|
||||
// Step 2: place it
|
||||
switch (proc->Params[i].Type)
|
||||
{
|
||||
|
@ -671,10 +723,19 @@ void ParamsIn(SystemProc *proc)
|
|||
/* if (proc->Params[i].Input == IOT_NONE)
|
||||
*((int*) place) = (int) NULL;
|
||||
else*/
|
||||
*((int*) place) = (int) AllocStr(realbuf);
|
||||
*((int*) place) = (int) (proc->Params[i].allocatedBlock = AllocStr(realbuf));
|
||||
break;
|
||||
case PAT_BOOLEAN:
|
||||
*((int*) place) = lstrcmpi(realbuf, "true");
|
||||
case PAT_WSTRING:
|
||||
case PAT_GUID:
|
||||
wstr = (LPWSTR) (proc->Params[i].allocatedBlock = GlobalAlloc(GPTR, g_stringsize*2));
|
||||
MultiByteToWideChar(CP_ACP, 0, realbuf, g_stringsize, wstr, g_stringsize);
|
||||
if (proc->Params[i].Type == PAT_GUID)
|
||||
{
|
||||
*((HGLOBAL*)place) = (proc->Params[i].allocatedBlock = GlobalAlloc(GPTR, 16));
|
||||
CLSIDFromString(wstr, *((LPCLSID*)place));
|
||||
GlobalFree((HGLOBAL) wstr);
|
||||
} else
|
||||
*((LPWSTR*)place) = wstr;
|
||||
break;
|
||||
case PAT_CALLBACK:
|
||||
// Generate new or use old callback
|
||||
|
@ -718,6 +779,7 @@ void ParamsOut(SystemProc *proc)
|
|||
{
|
||||
int i, *place;
|
||||
char *realbuf;
|
||||
LPWSTR wstr;
|
||||
|
||||
i = proc->ParamCount;
|
||||
do
|
||||
|
@ -745,17 +807,29 @@ void ParamsOut(SystemProc *proc)
|
|||
int num = lstrlen(*((char**) place));
|
||||
if (num >= g_stringsize) num = g_stringsize-1;
|
||||
lstrcpyn(realbuf,*((char**) place), num+1);
|
||||
realbuf[num] = 0;
|
||||
realbuf[num] = 0;
|
||||
}
|
||||
break;
|
||||
case PAT_BOOLEAN:
|
||||
lstrcpy(realbuf,(*((int*) place))?("true"):("false"));
|
||||
case PAT_GUID:
|
||||
wstr = (LPWSTR) GlobalAlloc(GPTR, g_stringsize*2);
|
||||
StringFromGUID2(*((REFGUID*)place), wstr, g_stringsize*2);
|
||||
WideCharToMultiByte(CP_ACP, 0, wstr, g_stringsize, realbuf, g_stringsize, NULL, NULL);
|
||||
GlobalFree((HGLOBAL)wstr);
|
||||
break;
|
||||
case PAT_WSTRING:
|
||||
wstr = *((LPWSTR*)place);
|
||||
WideCharToMultiByte(CP_ACP, 0, wstr, g_stringsize, realbuf, g_stringsize, NULL, NULL);
|
||||
break;
|
||||
case PAT_CALLBACK:
|
||||
wsprintf(realbuf, "%d", proc->Params[i].Value);
|
||||
break;
|
||||
}
|
||||
|
||||
// memory cleanup
|
||||
if ((proc->Params[i].allocatedBlock != NULL) && ((proc->ProcType != PT_STRUCT)
|
||||
|| (proc->Params[i].Option > 0)))
|
||||
GlobalFree(proc->Params[i].allocatedBlock);
|
||||
|
||||
// Step 2: place it
|
||||
if (proc->Params[i].Output == IOT_NONE);
|
||||
else if (proc->Params[i].Output == IOT_STACK) pushstring(realbuf);
|
||||
|
@ -1160,7 +1234,11 @@ void CallStruct(SystemProc *proc)
|
|||
// pointer
|
||||
ptr = (char*) &(proc->Params[i].Value);
|
||||
break;
|
||||
case PAT_STRING: ptr = (char*) proc->Params[i].Value; break;
|
||||
|
||||
case PAT_STRING:
|
||||
case PAT_GUID:
|
||||
case PAT_WSTRING:
|
||||
ptr = (char*) proc->Params[i].Value; break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#define PT_NOTHING 0
|
||||
#define PT_PROC 1
|
||||
#define PT_STRUCT 2
|
||||
#define PT_VTABLEPROC 3
|
||||
|
||||
// Proc results:
|
||||
#define PR_OK 0
|
||||
|
@ -29,8 +30,9 @@
|
|||
#define PAT_INT 1
|
||||
#define PAT_LONG 2
|
||||
#define PAT_STRING 3
|
||||
#define PAT_BOOLEAN 4
|
||||
#define PAT_CALLBACK 5
|
||||
#define PAT_WSTRING 4
|
||||
#define PAT_GUID 5
|
||||
#define PAT_CALLBACK 6
|
||||
|
||||
// Input/Output Source/Destination
|
||||
#define IOT_NONE 0
|
||||
|
@ -58,6 +60,7 @@ typedef struct
|
|||
int Size; // Value real size (should be either 1 or 2 (the number of pushes))
|
||||
int Input;
|
||||
int Output;
|
||||
HGLOBAL allocatedBlock; // block allocated for passing string, wstring or guid param
|
||||
} ProcParameter;
|
||||
|
||||
// Our single proc (Since the user will free proc with GlobalFree,
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
Microsoft Visual Studio Solution File, Format Version 7.00
|
||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "System", "System.vcproj", "{2FB013AB-6FD4-4239-9974-C999F4DFD70C}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
ConfigName.0 = Debug
|
||||
ConfigName.1 = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectDependencies) = postSolution
|
||||
Debug = Debug
|
||||
Release = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
{2FB013AB-6FD4-4239-9974-C999F4DFD70C}.Debug.ActiveCfg = Debug|Win32
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding = "windows-1251"?>
|
||||
<?xml version="1.0" encoding="windows-1251"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.00"
|
||||
Version="7.10"
|
||||
Name="System"
|
||||
ProjectGUID="{2FB013AB-6FD4-4239-9974-C999F4DFD70C}"
|
||||
Keyword="Win32Proj">
|
||||
|
@ -19,7 +19,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SYSTEM_EXPORTS"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SYSTEM_EXPORTS;SYSTEM_LOG_DEBUG"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
|
@ -33,7 +33,7 @@
|
|||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="kernel32.lib user32.lib RunTmChk.lib libcd.lib"
|
||||
OutputFile="$(OutDir)/System.dll"
|
||||
OutputFile="d:\Program FIles\NSIS\Plugins\System.dll"
|
||||
LinkIncremental="2"
|
||||
IgnoreAllDefaultLibraries="TRUE"
|
||||
GenerateDebugInformation="TRUE"
|
||||
|
@ -53,15 +53,22 @@
|
|||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="2">
|
||||
CharacterSet="2"
|
||||
WholeProgramOptimization="FALSE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
|
@ -71,20 +78,23 @@
|
|||
OmitFramePointers="TRUE"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SYSTEM_EXPORTS"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="4"
|
||||
StructMemberAlignment="0"
|
||||
BufferSecurityCheck="FALSE"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="3"
|
||||
AssemblerOutput="2"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="1"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="kernel32.lib user32.lib vc7ldvrm.obj vc7lmul.obj vc7lshl.obj vc7lshr.obj chkstk.obj"
|
||||
OutputFile="$(OutDir)/System.dll"
|
||||
AdditionalDependencies="kernel32.lib user32.lib vc7ldvrm.obj vc7lmul.obj vc7lshl.obj vc7lshr.obj chkstk.obj"
|
||||
OutputFile="d:\Program FIles\NSIS\Plugins\System.dll"
|
||||
LinkIncremental="1"
|
||||
IgnoreAllDefaultLibraries="TRUE"
|
||||
GenerateDebugInformation="FALSE"
|
||||
|
@ -108,10 +118,18 @@
|
|||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
|
@ -130,9 +148,6 @@
|
|||
<File
|
||||
RelativePath="Plugin.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="System.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="stdafx.c">
|
||||
<FileConfiguration
|
||||
|
@ -148,6 +163,15 @@
|
|||
UsePrecompiledHeader="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="System.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
ExpandAttributedSource="TRUE"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
|
@ -159,10 +183,10 @@
|
|||
RelativePath="Plugin.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="System.h">
|
||||
RelativePath="stdafx.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="stdafx.h">
|
||||
RelativePath="System.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
|
|
|
@ -93,6 +93,10 @@
|
|||
; HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);
|
||||
!define sysBitBlt "gdi32::BitBlt(i, i, i, i, i, i, i, i, i) i"
|
||||
|
||||
; proposed by abgandar
|
||||
; int AddFontResource(LPCTSTR lpszFilename);
|
||||
!define sysAddFontResource "gdi32::AddFontResourceA(t) i"
|
||||
|
||||
; HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);
|
||||
!define sysBeginPaint "user32::BeginPaint(i, i) i"
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ to the people living there, they'll always help you.
|
|||
By the way, any help in writing complete and easy-to-go System plugin
|
||||
documentation will be appreciated.
|
||||
|
||||
Note: it will be best to turn plugin onload off in case of using System
|
||||
Note: it will be best to turn plugin unload off in case of using System
|
||||
plugin (SetPluginUnload alwaysoff).
|
||||
|
||||
============== Main functions ==============
|
||||
|
@ -78,6 +78,9 @@ Proc:
|
|||
::addr -> Handle to system proc (memory address)
|
||||
*addr -> Structure
|
||||
* -> New structure
|
||||
IPtr->MemberIdx -> Call member with member index from interface given
|
||||
by interface pointer IPtr (IPtr will be passed to
|
||||
proc automatically, use like C++ call).
|
||||
nothing -> Dup proc, usually callback or for future defenition
|
||||
|
||||
proc -> Ready proc specification for use or redefinition
|
||||
|
@ -109,8 +112,8 @@ Params & Return - Type:
|
|||
i - int (includes char, byte, short, handles, pointers and so on)
|
||||
l - long & large integer (know as int64)
|
||||
t - text, string (LPCSTR, pointer to first character)
|
||||
b - boolean (needs/returns 'true':'false') - by the fact this type is
|
||||
senseless -> usual integer can be used ('0':'1')
|
||||
w - WCHAR text, or unicode string.
|
||||
g - GUID
|
||||
k - callback. See Callback section.
|
||||
|
||||
* - pointer specifier -> the proc needs the pointer to type, affects
|
||||
|
@ -124,7 +127,10 @@ For structures:
|
|||
&i - smaller types: &i4, &i2 (short), &i1 (byte)
|
||||
&l - cumbersome, but &lN means the structure size (N bytes value),
|
||||
calculated automaticaly, outputed always as int (N could be 0).
|
||||
&t - structure contains plain text, &tN - lenght == N bytes.
|
||||
&t - structure contains plain text, &tN, where lenght == N bytes.
|
||||
&w - structure contains plain unicode text, &tN,
|
||||
where lenght == (N)/2 chars = N bytes.
|
||||
&g - &gN copy N bytes of plain GUID. in fact guid size is 16 :)
|
||||
|
||||
----------------------------------
|
||||
Params & Return - Source / Destination:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue