有一个动态库,它的函数需要 C 语言的文件描述符作为输入:
int some_func (int fd, ...)
例如,作为调用_wopen函数的结果。
问题:如何从 Delphi 调用这个函数,或者更准确地说,如何获得它的正确描述符?它不接受由于调用 CreateFile() 而收到的常规句柄。
有这样一个实用程序 - wget,它允许您使用不同的协议下载脚本中的文件。但它有一个缺点:通过 http/s 下载时,它不允许(或者我没有找到如何)使用 socks-proxy。
在这方面,有一个问题:有人知道Windows [x64] 的[console] 应用程序,它可以使用具有授权的SOCKS5 代理服务器通过HTTP、HTTPS、[FTP] 协议下载文件,可以从命令中使用线?
PS:[..] 包含可取的但不是强制性的功能。
ZLib 库有一个 CompressBuf 函数,其部分代码如下:
procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
out OutBuf: Pointer; out OutBytes: Integer);
...
begin
...
OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; {*}
GetMem(OutBuf, OutBytes);
try
...
while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do begin {**}
P := OutBuf;
Inc(OutBytes, 256);
ReallocMem(OutBuf, OutBytes);
...
end;
据我了解,行 {*} 确定输出缓冲区的大小,考虑到数据可能不可压缩并且压缩结果将大于原始数据的事实。但是,从 {**} 块开始,即使这个大小也是第一个近似值,并且可能存在压缩数据的大小甚至更大的情况。
在这方面,我有一个问题:也许有人知道如何计算OutBytes需要分配的缓冲区的 [最佳 *] 大小,以保证它适合任何deflate()输入的输出,大小?InBytes
[*] 最优不一定是最小的(尽管它是可取的),而是合理的。那些。InBytes*2例如,如果保证足够,则不分配InBytes*1.25。
我正在尝试制作一个窗口,在从我的应用程序切换到它启动的浏览器时显示一些信息。结果,目前尝试:
在任何情况下,通过 ShellExecute() 命令调用的 Chrome 都会与此窗口重叠......以及其他应用程序。TopMost 仅适用于我的应用程序中的其他表单。
也许有人已经经历过这种行为并且知道如何解决这个问题?
PS:无边框窗口(BorderStyle = []),Delphi XE2,Windows 10 build 14393;
我正在编写一些适用于机密(对我而言)数据的应用程序。我希望,理想情况下,在它工作之后,内存中的这些数据不会有“尾巴”。
在这方面,出现了一个想法:如您所知,SetLength() 过程在增加字符串/数组的大小时,可以为其分配一个新的内存块,如果它没有足够的空间,则从旧内存块复制数据旧位置新尺寸的空间。
好吧,实际上问题是:是否可以使用这样的包装器(见评论)?
procedure SecureResize(var Data: TBytes; NewSize: Integer);
var
OldPtr: Pointer;
OldSize: Integer;
begin
OldPtr := Pointer(Data);
OldSize := Length(Data);
SetLength(Data, NewSize);
if (OldSize < NewSize) and (OldPtr <> Pointer(Data)) then
begin {
Данные были перемещены, поэтому необходимо затереть их в старой
локации. Формально, OldPtr указывает на "свободный" участок памяти,
но может ли его за это время занять другой процесс или можно
гарантировать что в этом месте он ещё никем не занят и спокойно
затереть данные?.. }
FillChar(OldPtr^, OldSize, 0);
end else if OldSize > NewSize then
FillChar(Data[NewSize], OldSize - NewSize, 0);
end;
有一个类,让我们说:
TListEx<T: TBaseClass> = class ...
....
procedure Sort;
....
end;
并且有一些事件 TNotifyEvent 您需要在其中调用此排序:
procedure TMyForm.ListEvent(Sender: TObject);
begin
....
(Sender as ??????).Sort;
end;
问题:应该写什么而不是“?????” ?如果我在那里写,那么当我用( )TListEx<TBaseClass>调用方法时,我仍然会收到类型不匹配错误“无效的类类型转换”。Sender = TListEx<TExtClass>TExtClass = class(TBaseClass)
但是方法还是通用的吗?如何解决这个麻烦?
更准确地说,目前我决定它是,但为了可靠性TListEx<TBaseClass>(Sender).Sort,我仍然想完成它。as
下午好。
我正在尝试为我在 Firebird 中的应用程序开发一个数据库,同时我想在其中实现一些管理用户及其权限的机制(内置于数据库本身对于我的任务来说太复杂了)。
底线很简单:所有对表中数据的应用程序操作都是通过存储过程执行的(只计划 5-6 个表),而所有应用程序用户(以下简称用户)通过一个公共数据库用户与数据库进行操作,该用户具有执行所有 SP 的权利,仅此而已(所有其他必要的权利都授予程序本身)。
同时,每个SP在访问它的时候,通过表单的请求来检查当前用户
select s.user_id from session
left join users u on u.user_id = s.user_id
where (s.session_id = rdb$get_context('USER_SESSION', 'SESSION_ID'))
and (u.enabled = 1)
into :uid;
问题 #1:就运行时而言,每次访问 SP 时检查用户状态有多重要?
或者也许应该简化为
select user_id from session
where session_id = rdb$get_context('USER_SESSION', 'SESSION_ID')
into :uid
, 以及用户是否启用,只检查 USER_LOGIN?..
问题2:从方便和美观的角度来看,我想一般将这段代码(第一个选项)移动到一个单独的SP中,以免在每个SP的开头重复它,比如:
execute procedure get_currentuser returning_values :uid;
但无法在 Firebird 中找到有关嵌套过程调用的详细信息。我想知道这样做有多正确以及它的工作速度有多快或多慢?
PS:可以在此处查看 SESSION 和 USERS 表的大致视图。
下午好。
有一组数据要存储在数据库表中。每个元素(行)看起来像这样:
Name: string[32]
Info: array [0..31]
Data: array [0..255]
问题:在表中存储二进制数据的最佳和最方便的方法是什么 - 作为 char[32]、char[256] 还是作为 blob?
第二个问题:是否可以通过 sql 查询(例如,使用 TQuery)以某种方式从 char 字段中保存/读取二进制数据,而不将它们转换为类似 0xF87D82391BA70 的字符串...?
下午好。
有这样一种情况:有一些服务在计算机启动时启动,并在必要时执行一些操作。有必要在执行这些操作时,没有用户可以登录系统,因为。正在运行的应用程序可能会干扰服务。
问题:有没有什么办法可以延迟用户选择的出现,就像 Windows Update 那样('等等,系统正在配置')?..
补充: Windows 7,正常登录,不是终端,不是域。因为 由于该服务是我编写的,因此我正在通过类型的 WinAPI 寻找解决方案:阻塞 - 更改需要的内容 - 解除阻塞。