我在Lazarus编程论坛上询问如何打开物理磁盘.我想允许用户在单击"选择磁盘"按钮时从系统中选择物理磁盘.Stack Overflow中有一些类似但不完全相同的示例(例如Delphi - 使用DeviceIoControl传递IOCTL_DISK_GET_LENGTH_INFO来获取闪存介质的物理大小(非分区)).
有很多C和C++使用的例子CreateFile(在文档中,特别是调用的例子DeviceIoControl)但我找不到任何Free Pascal或Delphi,我还不够好,我还没有找到如何做到这一点.
任何人都可以指向我解释它的链接的方向或更好仍然是用Delphi或Free Pascal编写的实际示例?任何人都可以帮我理解如何使用它吗?
平台: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].
我的问题:我如何调整上述代码才能实现这一目标?
作为一名历史学家,在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) 我有以下内容:
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)
不确定上述是否正确,但我的另一个问题是如何更改其中一个方向True或False?
我现在达到了我的一个混乱状态:(
这是我尝试设置值的最后一件事,但我得到的是Illegal Expression(在Lazarus中).
Directions(TDirection(DirNorth)) := True;
Run Code Online (Sandbox Code Playgroud) “ Inno-Setup编译器”不知道pascal数据类型“ QWord”。是否有64位等效项?
谢谢
如何将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) 使用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 …
我尝试按照安装Indy10和Lazarus的说明进行操作.下载Indy 10下载后,使用正确的密码我只看到Delphi代码,没有名为lazarus或freepascal的文件夹.Indy10的Lazarus版本已被删除吗?
请考虑以下代码:
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超出范围时自动释放数组元素?
我有一些用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) freepascal ×10
delphi ×8
lazarus ×6
fpc ×2
indy ×2
pascal ×2
delphi-xe ×1
delphi-xe5 ×1
indy10 ×1
inno-setup ×1
installer ×1
scheme ×1
sicp ×1