在Winapi.Windows.pas的Delphi XE3的,着以前定义为许多C类型PWideChar和PAnsiChar现在被定义为MarshaledString和MarshaledAString分别(例如PWChar,LPSTR):
PWChar = MarshaledString;
LPSTR = MarshaledAString;
Run Code Online (Sandbox Code Playgroud)
事实上,在System.pas,MarshaledString并且MarshaledAString是等同于PWideChar和PAnsiChar分别,
MarshaledString = PWideChar;
MarshaledAString = PAnsiChar;
Run Code Online (Sandbox Code Playgroud)
但这个决定背后的背景是什么?我的意思是,为什么Embarcadero 应该重新定义这样的C字符串类型?
在Windows.pas,有:
LARGE_INTEGER = record
case Integer of
0: (
LowPart: DWORD;
HighPart: Longint);
1: (
QuadPart: LONGLONG);
end;
TLargeInteger = Int64;
Run Code Online (Sandbox Code Playgroud)
我看到几个Windows函数和结构成员最初声明为LARGE_INTEGER已被翻译为TLargeInteger如下:
function QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger): BOOL;
stdcall;
Run Code Online (Sandbox Code Playgroud)
另一个例子是:
WIN32_STREAM_ID = record
dwStreamId : DWORD;
dwStreamAttributes: DWORD;
Size : TLargeInteger;
dwStreamNameSize : DWORD;
cStreamName : array[0..0] of WCHAR;
end;
Run Code Online (Sandbox Code Playgroud)
可以TLargeInteger作为LARGE_INTEGERWindows头文件中找到的每个函数参数和结构成员的替代吗?
procedure Test;
var
AText: array of AnsiChar;
begin
SetLength(AText, 7);
end;
Run Code Online (Sandbox Code Playgroud)
AText在内存中占用的实际大小是多少?是7 +长度的基数大小,即7 + 4 = 11字节?
这个问题与我之前的问题有关系,动态数组占用的"实际"内存大小是多少?
var
AText: array [0..6] of AnsiChar;
Run Code Online (Sandbox Code Playgroud)
AText在内存中占用的实际大小是多少?真的是7个字节吗?
function Test: Boolean;
var
a, b, c: Integer;
begin
...
end;
Run Code Online (Sandbox Code Playgroud)
当执行包含这样的代码的程序,是a,b和c每个时间分配Test被调用时,或者是它们在执行的初始化阶段仅分配一次某处?我问这个是因为调试器中没有这样的信息.
procedure TForm1.FormCreate(Sender: TObject);
var
Str: string;
PStr: PChar;
begin
Str := 'This a string.';
PStr := Pointer(Str); // PStr holds the address of the first char of Str
ShowMessage(IntToStr(Longint(PStr))); // It displays e.g. 4928304
Setlength(Str, 20);
// I don't know what actually happens in the call for SetLength() above,
// because the address of Str changes now, so the PStr not valid anymore.
// This is a proof of the fact
PStr := Pointer(Str);
ShowMessage(IntToStr(Longint(PStr))); // It's now different, …Run Code Online (Sandbox Code Playgroud) 实际上,我正在研究编程语言之间的数据类型比较,这是我在阅读C和C++标准时遇到的问题.
引自C11,
wctrans_t是一种标量类型,可以包含表示特定于语言环境的字符映射的值
wctype_t是一种标量类型,可以包含表示特定于语言环境的字符分类的值
短语类型表示C11不限制wctrans_t并且wctype_t是特定的标量类型.
我的GCC 4.8 MinGW实现wctrans_t并wctype_t作为typedef wchar_t,我不认为有任何其他C编译器没有定义它们的原因.
有人可以证明其他方面,或者是否有可能发生这种情况?
考虑我有一个Str参数传递参数的过程,我想通过过程修改给定变量的内容,例如
procedure Replace(var Str: string);
var
PStr: PChar;
i: Integer;
begin
PStr := @Str[1];
for i := 1 to Length(Str) do begin
PStr^ := 'x';
Inc(PStr);
end;
end;
Run Code Online (Sandbox Code Playgroud)
这是一个可接受的指针用法吗?我不确定它是否有内存泄漏.
真正发生了什么PStr := @Str[1],编译器是否在Str内部复制,或者是什么?
这种代码优化值得吗?
在编写使用Windows API函数或某些Windows DLL函数(例如ntdll.dll)的函数/过程/方法时,应该使用哪个Delphi异常类来引发最后的Win32/Win64错误?
引自Delphi XE3文档有关System.SysUtils.EExternal:
"注意:EExternal类代表Win32异常代码.ExceptionRecord成员指向Win32异常记录."
从那时起,我得出结论,Win32和Win64异常机制之间存在差异.它们之间有什么区别?
出于调试目的 - 我的意思是关于堆栈帧相关的东西 - 差异是否导致每个平台的异常处理的代码实现不同?
FILE_BOTH_DIR_INFORMATION结构的ShortNameLength成员声明如下:
typedef struct FILE_BOTH_DIR_INFORMATION {
...
CCHAR ShortNameLength;
...
};
Run Code Online (Sandbox Code Playgroud)
从类型的解释来看CCHAR,CCHAR是一个8位Windows(ANSI)字符.那么,它相当于AnsiCharDelphi,对吧?但是,ShortNameLengthFILE_BOTH_DIR_INFORMATION结构成员的描述说,
" ShortNameLength指定短文件名字符串的长度(以字节为单位)."
该声明让我觉得CCHAR相当于ByteDelphi.另一个例子是其NumberOfProcessors成员SYSTEM_BASIC_INFORMATION声明winternl.h如下:
typedef struct _SYSTEM_BASIC_INFORMATION {
BYTE Reserved1[24];
PVOID Reserved2[4];
CCHAR NumberOfProcessors;
}
Run Code Online (Sandbox Code Playgroud)
再一次,CCHAR类型似乎在Byte上下文中使用,而不是在AnsiChar上下文中使用.
现在,我混淆了,无论是使用AnsiChar还是Byte作为CCHARDelphi中的等价物.
JwaWinType.pas的JEDI的Windows API声明CCHAR为AnsiChar.