小编Ast*_*oth的帖子

Delphi XE3:MarshaledString和MarshaledAString用于什么新类型?

Winapi.Windows.pas的Delphi XE3的,着以前定义为许多C类型PWideCharPAnsiChar现在被定义为MarshaledStringMarshaledAString分别(例如PWChar,LPSTR):

  PWChar = MarshaledString;
  LPSTR  = MarshaledAString;
Run Code Online (Sandbox Code Playgroud)

事实上,在System.pas,MarshaledString并且MarshaledAString是等同于PWideCharPAnsiChar分别,

  MarshaledString  = PWideChar;
  MarshaledAString = PAnsiChar;
Run Code Online (Sandbox Code Playgroud)

但这个决定背后的背景是什么?我的意思是,为什么Embarcadero 应该重新定义这样的C字符串类型?

delphi string types delphi-xe3

6
推荐指数
1
解决办法
952
查看次数

LARGE_INTEGER或TLargeInteger?

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头文件中找到的每个函数参数和结构成员的替代吗?

delphi

6
推荐指数
1
解决办法
2005
查看次数

动态数组占用的"实际"内存大小是多少?

例:

procedure Test;
var
  AText: array of AnsiChar;
begin
  SetLength(AText, 7);
end;
Run Code Online (Sandbox Code Playgroud)

AText在内存中占用的实际大小是多少?是7 +长度的基数大小,即7 + 4 = 11字节?

delphi

5
推荐指数
1
解决办法
528
查看次数

静态数组占用的"实际"内存大小是多少?

这个问题与我之前的问题有关系,动态数组占用的"实际"内存大小是多少?

例:

var
  AText: array [0..6] of AnsiChar;
Run Code Online (Sandbox Code Playgroud)

AText在内存中占用的实际大小是多少?真的是7个字节吗?

delphi

5
推荐指数
1
解决办法
282
查看次数

何时为局部变量分配空间?

function Test: Boolean;
var
  a, b, c: Integer;
begin
  ...
end;
Run Code Online (Sandbox Code Playgroud)

当执行包含这样的代码的程序,是a,bc每个时间分配Test被调用时,或者是它们在执行的初始化阶段仅分配一次某处?我问这个是因为调试器中没有这样的信息.

delphi

5
推荐指数
2
解决办法
228
查看次数

为什么System.SetLength(Str,Len)会导致Str的地址发生变化?

代码图

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)

delphi

5
推荐指数
2
解决办法
939
查看次数

是否有理由让任何C或C++编译器不将wctrans_t和wctype_t定义为wchar_t类型?

实际上,我正在研究编程语言之间的数据类型比较,这是我在阅读C和C++标准时遇到的问题.

引自C11,

wctrans_t一种标量类型,可以包含表示特定于语言环境的字符映射的值

wctype_t一种标量类型,可以包含表示特定于语言环境的字符分类的值

短语类型表示C11不限制wctrans_t并且wctype_t是特定的标量类型.

我的GCC 4.8 MinGW实现wctrans_twctype_t作为typedef wchar_t,我不认为有任何其他C编译器没有定义它们的原因.

有人可以证明其他方面,或者是否有可能发生这种情况?

c c++ widechar

5
推荐指数
1
解决办法
316
查看次数

通过指针修改字符串变量的内容是否安全?

考虑我有一个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内部复制,或者是什么?

这种代码优化值得吗?

delphi

4
推荐指数
1
解决办法
340
查看次数

Delphi:应该使用哪个异常类来引发最后的Win32/Win64错误?

  1. 在编写使用Windows API函数或某些Windows DLL函数(例如ntdll.dll)的函数/过程/方法时,应该使用哪个Delphi异常类来引发最后的Win32/Win64错误?

    引自Delphi XE3文档有关System.SysUtils.EExternal:

    "注意:EExternal类代表Win32异常代码.ExceptionRecord成员指向Win32异常记录."
  2. 从那时起,我得出结论,Win32和Win64异常机制之间存在差异.它们之间有什么区别?

  3. 出于调试目的 - 我的意思是关于堆栈帧相关的东西 - 差异是否导致每个平台的异常处理的代码实现不同?

delphi freepascal

3
推荐指数
1
解决办法
873
查看次数

Delphi中的CCHAR类型是什么?

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.pasJEDI的Windows API声明CCHARAnsiChar.

delphi

3
推荐指数
1
解决办法
208
查看次数

标签 统计

delphi ×9

c ×1

c++ ×1

delphi-xe3 ×1

freepascal ×1

string ×1

types ×1

widechar ×1