- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我从 Delphi 6 迁移到 Delphi 10.2 Tokyo 时当我尝试将 ^PChar 的指针转换为 PChar 数组时出现错误
type
PServEnt = ^TServEnt;
TServEnt = packed record
s_name: PChar; // official service name
s_aliases: ^PChar; // alias list
s_port: Smallint; // protocol to use
s_proto: PChar; // port #
end;
function TIdStackWindows.WSGetServByPort(
const APortNumber: Integer): TIdStrings;
var
ps: PServEnt;
i: integer;
p: array of PChar;
begin
Result := TIdStringList.Create;
p := nil;
try
ps := GetServByPort(HToNs(APortNumber), nil);
if ps <> nil then
begin
Result.Add(ps^.s_name);
i := 0;
p := Pointer(ps^.s_aliases); // get error Incompatible types: 'Dynamic array' and 'Pointer'
while p[i] <> nil do
begin
Result.Add(PChar(p[i]));
inc(i);
end;
end;
except
Result.Free;
end;
end;
此代码在 Delphi 2010 中运行良好,如何使其在 Delphi 10.2 Tokyo 中正确
最佳答案
错误消息是正确的,如果代码是在早期版本的 Delphi 中编译的,那是因为那些早期版本的编译器有缺陷。
动态数组不仅仅是指向第一个元素的指针。它还封装了存储数组长度和引用计数的元数据。因此,您的 Actor 阵容无效。您逃脱了这个无效代码,因为您没有尝试访问此元数据,但这既是出于偶然,也是有意为之。
不要尝试转换为动态数组。而是使用指针算术。例如:
function TIdStackWindows.WSGetServByPort(
const APortNumber: Integer): TIdStrings;
var
ps: PServEnt;
p: PPChar;
begin
Result := TIdStringList.Create;
try
ps := GetServByPort(HToNs(APortNumber), nil);
if ps <> nil then
begin
Result.Add(ps^.s_name);
p := PPChar(ps^.s_aliases); // cast needed due to Indy record type's use of un-nameable type
while p^ <> nil do
begin
Result.Add(p^);
inc(p);
end;
end;
except
Result.Free;
raise;
end;
end;
我将别名列表的类型声明更改为 PPChar
,以避免在分配给该类型的局部变量时出现不兼容的类型错误。
另请注意,我已经更正了您的异常处理,该处理以前吞咽异常并返回无效的对象引用。
关于delphi - ^Pchar 指向 PChar 数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55377291/
当我从 Delphi 6 迁移到 Delphi 10.2 Tokyo 时当我尝试将 ^PChar 的指针转换为 PChar 数组时出现错误 type PServEnt = ^TServEnt;
所以,我有以下问题。我有 2 个 PChar 变量。我首先分配内存,执行一些操作,为第二个变量分配内存 - 在这一步中,第一个变量包含错误值(我在调试时看到它)。这是代码: procedure TRe
sharedMemory的此限制是实际的吗? 我已经传递给DLL字符串长度约370个字符,并且DLL毫无问题地读取了它。 我问,因为我将PChar从DLL返回到EXE程序。 在DLL中,我使用GetM
这似乎是一个基本问题,但我在任何地方都找不到解决方案。 我必须从内核模式获取信息。因此我与 IOCTL 一起工作。我的用户模式应用程序使用 DeviceIoControl 和 METHOD_OUT_D
我的应用程序中有以下功能: function GetDeviceChannelInfo_HSI(PortNumber, Address, ChNumber: Integer; var State:
我正在写一个使用C-DLL的工具。 C-DLL的功能需要char*,它采用UTF-8格式。 我的问题:我可以通过PChar还是必须使用UTF8Encode(string)? 最佳答案 考虑一个名为s的
对delphi win 32编程了解不多,希望有人能解答我的问题。 我将重复的 l_sGetUniqueIdBuffer 保存到我想避免的数据库中。 l_sGetUniqueIdBuffer 在行之间
我使用 WinSock 2 编写了一些 TCP 服务器,并且我有一个捕获 FD_READ 事件的程序。在此过程中,我需要解析收到的消息。代码在这里: procedure TfrmMain.WndPro
如果重要的话,我正在使用Delpi XE6。 我正在编写一个 DLL,它将从 Google 的 Directions API 获取响应,解析生成的 JSON 并确定行程的总距离。 GetJSONStr
考虑以下代码: procedure Test; var MyPCharArray: array of PChar; begin SetLength(MyPCharArray, 3); Ge
在分析过程中,我遇到了一个需要相当多时间的函数,但本质上可以归结为这段非常简单的代码: function GetSubstring(AInput: PChar; AStart, ASubstringL
我有这个代码: ShellExecute(Handle, 'open', 'C:\Users\user\Desktop\sample\menu\WTSHELP\start.h
我有一个非常愚蠢的问题......为什么这段代码: PChar('x'); 导致“访问冲突”错误?编译器优化? 示例: var s: String; ... s := StrPas(PAnsiChar
我有一个令人费解的结果,我很难理解。 我一直在尝试提高这个例程的速度 function TStringRecord.GetWord: String; begin // return the nex
我经常读到编译器在转换为 PChar 时会产生某种魔力。 . PChar的主要目的|是在期望零终止字符数组(C 风格的“字符串”)的库中调用外部代码。 PChar是 PWideChar 的别名类型关于
PAnsiChar 和 PChar 之间有区别吗?是什么类型? (德尔福2007年之前) 提前谢谢您! 最佳答案 D2009 及之后:是的,有。 PChar 是指向 Char 的指针,它是 unico
我正在使用ReadProcessMemory函数读取外部正在运行的应用程序的内容,我有一个指向PChar(UNICODE)的内存地址。我想知道哪种方法可以将该值返回到字符串变量? 现在我正在使用此代码
var S: string; begin SetLength(S, MAX_SIZE);// when casting to a PChar, be sure the string is no
我需要生成一个 href到一个 URI。除了需要百分比编码的保留字符外,一切都很容易,例如链接到 /some/path;element应显示为 (我知道 path;element 代表一个实体)。
我需要构造一个字符串并通过 PostMessage 发送它,即。 FileName := String_1 + String_2 + String_3; PostMessage(FWndHandle,
我是一名优秀的程序员,十分优秀!