标签: freepascal

如何使用CreateFile访问物理磁盘?

我在Lazarus编程论坛上询问如何打开物理磁盘.我想允许用户在单击"选择磁盘"按钮时从系统中选择物理磁盘.Stack Overflow中有一些类似但不完全相同的示例(例如Delphi - 使用DeviceIoControl传递IOCTL_DISK_GET_LENGTH_INFO来获取闪存介质的物理大小(非分区)).

有很多C和C++使用的例子CreateFile(在文档中,特别是调用的例子DeviceIoControl)但我找不到任何Free Pascal或Delphi,我还不够好,我还没有找到如何做到这一点.

任何人都可以指向我解释它的链接的方向或更好仍然是用Delphi或Free Pascal编写的实际示例?任何人都可以帮我理解如何使用它吗?

delphi freepascal lazarus fpc

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

遍历多个子串实例的字符串 - freepascal或delphi

平台:Lazarus 1.1,FreePascal 2.7.1,Win 7 32位.

我有一个字符串值如下:

FileName[12345][45678][6789].jpg
Run Code Online (Sandbox Code Playgroud)

默认情况下(假设这是默认行为0),我的程序当前从最后一对方括号中取出最后一组数字到文件名的最右边,即6789.它使用以下代码:

if chkbxOverrideUniqueID.Checked then
   IDOverrideValue := StrToInt(edtToggleValue.Text);   
// User is happy to find the right most unique ID
if not chkbxOverrideUniqueID.Checked then      
  LastSquareBracket := RPos(']', strFileName);
  PreceedingSquareBracket := RPosEx('[', strFileName, LastSquareBracket) + 1;
  strFileID := AnsiMidStr(strFileName, PreceedingSquareBracket, LastSquareBracket - PreceedingSquareBracket)
else // User doesn't want to find the rightmost ID. 
  // and now I am stuck! 
Run Code Online (Sandbox Code Playgroud)

但是,我现在为用户添加了一个指定非默认行为的选项.例如,如果他们输入'1',则表示"从最右边的ID中查找第一个ID".例如[45678],因为[6789]是默认行为0,请记住.如果他们输入2,我希望它找到[12345].

我的问题:我如何调整上述代码才能实现这一目标?

freepascal lazarus

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

使用FPC编写Scheme解释器:分配和指针

作为一名历史学家,在FPC中编写一个Scheme解释器已经在第一阶段转向对我来说是一项严肃的任务.:)我正在关注Peter Michaux的博客,他在C中展示了如何做到这一点(还有一个Ada的翻译,可能对Pascal有帮助).

从Michaux的工作中考虑C中的这两个函数(v 0.1):

object *alloc_object(void) {
    object *obj;

    obj = malloc(sizeof(object));
    if (obj == NULL) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }
    return obj;
}

object *make_fixnum(long value) {
    object *obj;

    obj = alloc_object();
    obj->type = FIXNUM;
    obj->data.fixnum.value = value;
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

据我所知(只是C中的基本阅读知识),构造函数make_fixnum返回一个指向struct的指针(类型为fixnum的标记数据); 对于构造的对象,必须分配内存(感谢@David Heffernan 昨天的观点).

这是我到目前为止对FPC的翻译,它编译时没有任何错误:

program scheme;

type
   TTag = (ScmFixnum);
   PScmObject = ^TScmObject;
   TScmObject = record
      case ScmObjectTag: TTag of
         ScmFixnum: (ScmObjectFixnum: integer); …
Run Code Online (Sandbox Code Playgroud)

delphi scheme pascal freepascal sicp

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

如何设置枚举类型的值?

我有以下内容:

TDirection = (dirNorth, dirEast, dirSouth, dirWest);
TDirections = set of TDirection;
Run Code Online (Sandbox Code Playgroud)

在一个单独的类中,我将它声明为属性:

property Directions: TDirections read FDirections write FDirections;
Run Code Online (Sandbox Code Playgroud)

我想要的是能够像对待布尔人一样对待它们,所以例如如果dirNorth是真的那么它将是1,如果是假的话0.

我想把它想象成 (1,0,0,0)

我想检查方向是否为True,我可以使用:

var
  IsTrue: Boolean;
begin
  IsTrue := (DirNorth in Directions);
Run Code Online (Sandbox Code Playgroud)

不确定上述是否正确,但我的另一个问题是如何更改其中一个方向TrueFalse

我现在达到了我的一个混乱状态:(

这是我尝试设置值的最后一件事,但我得到的是Illegal Expression(在Lazarus中).

Directions(TDirection(DirNorth)) := True;
Run Code Online (Sandbox Code Playgroud)

delphi freepascal lazarus delphi-xe

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

Inno Setup-没有64位数据类型?

“ Inno-Setup编译器”不知道pascal数据类型“ QWord”。是否有64位等效项?

谢谢

installer pascal inno-setup freepascal

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

将FPC .o文件链接到Delphi

如何将FPC .o从库链接到Delphi可执行文件.当我尝试链接以下代码时,我得到了一堆不满意的前向或外部声明.

library project1;

{$mode objfpc}{$H+}

uses
  Classes
  { you can add units after this };

function Test: Integer;
begin
  Result := -1;
end;

begin
end.


[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$SYSTEM'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FINALIZE$_$OBJPAS'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$LNFODWRF'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'FINALIZE$_$LNFODWRF'
[dcc64 Error] Project2.dpr(170): E2065 Unsatisfied forward or external declaration: 'INIT$_$FPINTRES'
[dcc64 Error] Project2.dpr(170): …
Run Code Online (Sandbox Code Playgroud)

delphi freepascal fpc delphi-xe5

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

如何在Indy SSL中设置ConnectTimeout / ReadTimeout

使用SSL时如何在Indy中设置ConnectTimeout / ReadTimeout?

MCVE:

program mcve;

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}SysUtils, IdHTTP, IdSSLOpenSSL, DateUtils;

var
  HTTP    : TIdHTTP;
  SSL     : TIdSSLIOHandlerSocketOpenSSL;
  Started : TDateTime;
begin
  HTTP := TIdHTTP.Create();
  try
    HTTP.ReadTimeout            := 1000;
    HTTP.ConnectTimeout         := 2000;
    SSL                         := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
    SSL.ConnectTimeout          := HTTP.ConnectTimeout;
    SSL.ReadTimeout             := HTTP.ReadTimeout;
    SSL.SSLOptions.SSLVersions  := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    HTTP.IOHandler              := SSL;
    Started := Now;
    try
      HTTP.Get(ParamStr(1));
    except
      On E: Exception do WriteLn(E.Message);
    end;
    Writeln(FormatDateTime('hh:nn:ss', SecondsBetween(Started, Now) / SecsPerDay));
  finally
    HTTP.Free;
  end;
end.
Run Code Online (Sandbox Code Playgroud)

使用httpConnectTimeout / ReadTimeout时,只有在使用时,此问题才能解决https …

delphi freepascal indy lazarus

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

Indy10 Free Pascal

我尝试按照安装Indy10和Lazarus的说明进行操作.下载Indy 10下载后,使用正确的密码我只看到Delphi代码,没有名为lazarus或freepascal的文件夹.Indy10的Lazarus版本已被删除吗?

delphi freepascal indy lazarus indy10

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

Delphi:应该手动释放PChar数组的已分配元素吗?

请考虑以下代码:

procedure Test;
var
  MyPCharArray: array of PChar;

begin
  SetLength(MyPCharArray, 3);

  GetMem(MyPCharArray[0], 5);
  GetMem(MyPCharArray[1], 5);
  GetMem(MyPCharArray[2], 5);

  StrCopy(MyPCharArray[0], 'test');
  StrCopy(MyPCharArray[1], 'abcd');
  StrCopy(MyPCharArray[2], '1234');

  // Are these necessary?
  FreeMem(MyPCharArray[0], 5);
  FreeMem(MyPCharArray[1], 5);
  FreeMem(MyPCharArray[2], 5);
end;
Run Code Online (Sandbox Code Playgroud)

是否应手动释放已分配的元素,否则编译器将在MyPCharArray超出范围时自动释放数组元素?

delphi freepascal

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

Pascal Synapse错误处理

我有一些用Lazarus / FreePascal编写的使用Synapse IMAPSend库单元的代码。我尝试通过SSL(IMAPS)登录到IMAP服务器,但调用Login失败。

我试过检查异常-没有抛出异常。

除了与适当的服务器和端口的TCP三向握手之外,Wireshark没有显示任何内容。

这是代码

function GetImapResponse(host, port, user, pass:String): String;
var
  response: String = '';
  imap: TIMAPSend;
  no_unseen: integer;
begin
  imap := TIMAPSend.create;
  try
    imap.TargetHost := host;  //'10.0.0.16';
    imap.TargetPort := port;  //'993';
    imap.UserName := user;    //'red';
    imap.Password := pass;    //'********';
    imap.AutoTLS := false;
    imap.FullSSL := true;
    response := response + 'IMAP login to '+user+'@'+host+':'+port+' ... ';
    if imap.Login then
    begin
      response := response + 'Logged in OK. ';
      // How many …
Run Code Online (Sandbox Code Playgroud)

delphi exception-handling freepascal lazarus

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