小编jus*_*tyy的帖子

通过Delphi Olevariant类型获取COM对象的成员

是否可以通过OleVariant类型获取COM对象的成员列表(属性,函数,过程)?

例如,

var
  wscript: Olevariant;
begin
  wscript := CreateOleObject("WScript.Shell");
  ...
end;
Run Code Online (Sandbox Code Playgroud)

我特别感兴趣的是获取WScript.Echo,WScript.Quit等功能列表.

我想拥有此功能,因为它可以实现代码自动完成.

delphi com

8
推荐指数
1
解决办法
3183
查看次数

LongInt和Integer,LongWord和Cardinal之间的区别

在Delphi中,LongInt和Integer,LongWord和Cardinal有什么区别?

有时我会发现DWORD的用法,它是什么?

它们在所有版本的Delphi中是否一致?我应该坚持哪一个?

delphi

8
推荐指数
1
解决办法
1万
查看次数

如何在Delphi XE3中使用align-data-move SSE?

我试图运行以下,

type
  Vector = array [1..4] of Single;

{$CODEALIGN 16}
function add4(const a, b: Vector): Vector; register; assembler;
asm
  movaps xmm0, [a]
  movaps xmm1, [b]
  addps xmm0, xmm1
  movaps [@result], xmm0
end;
Run Code Online (Sandbox Code Playgroud)

它提供了对movaps的访问冲突,据我所知,如果内存位置为16对齐,则可以信任movaps.如果movups(不需要对齐),它没有问题.

所以我的问题是,在Delphi XE3中,{$ CODEALIGN}在这种情况下似乎不起作用.

编辑

很奇怪......我尝试了以下几点.

program Project3;

{$APPTYPE CONSOLE}

uses
  windows;  // if not using windows, no errors at all

type
  Vector = array [1..4] of Single;

function add4(const a, b: Vector): Vector;
asm
  movaps xmm0, [a]
  movaps xmm1, [b]
  addps …
Run Code Online (Sandbox Code Playgroud)

delphi assembly sse basm

7
推荐指数
1
解决办法
1697
查看次数

如何使用SetLength在Delphi中发生内存不足异常时释放内存

我有一段Delphi代码

var
  a: array of array of array of integer;
begin
  try
   SetLength(a, 100000, 100000, 10000); // out of memory here
   doStuffs(a); 
  except
   a = nil; // try to free the memory 
  end;
end;
Run Code Online (Sandbox Code Playgroud)

上面的代码尝试分配大量内存out-of-memory并将被捕获.该a=nil会执行,但该内存不释放.

在出现内存异常的情况下,有没有办法释放内存?

我试过SetLength(a, 0, 0, 0)Finalize(a),都不会工作.

memory delphi free multidimensional-array

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

哪一个在Delphi COM对象的性能,早期绑定或后期绑定方面更好

在delphi中,如果要创建COM对象,可以通过两种方式完成,

第一个是早期绑定,例如,

uses
  MSScriptControl_TLB; // MS Script Control

var
  obj: IScriptControl;
begin
  obj := CreateOleObject('ScriptControl') as IScriptControl;
  .. 
  ..
  obj.ExecuteStatement('Msgbox 1') 
end;
Run Code Online (Sandbox Code Playgroud)

或者,你可以这样做(后期绑定)

var
  obj: OleVariant;

begin
  obj := CreateOleObject('ScriptControl') ;
  obj.ExecuteStatement('Msgbox 1');
end;
Run Code Online (Sandbox Code Playgroud)

哪一个在性能方面更好?

delphi com

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

500个数字的最快简单排序算法(快速排序/合并排序除外)是什么?

我想实现一些足够快的排序算法,可以多次排序500个数字(例如每次排序500个数字的300次迭代)

我不喜欢快速排序,合并排序,因为它们比冒泡排序,选择排序,插入排序更难实现.

只是想知道什么是最好的(简单的实现和一些最佳情况复杂度小于O(N 2),如果已经排序了很多数字)在这种情况下最简单的排序算法

要排序的数字是双打的类型.

sorting algorithm

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

Delphi Copy-on-Write for String

我有这样的代码:

function Test: string;
var
   r, s: string;
begin
   r := 'Hello';
   Writeln(NativeInt(PChar(@r[1])));
   s := r;
   Writeln(NativeInt(PChar(@s[1])));
   Result := r;
   Writeln(NativeInt(PChar(@Result[1])));
end;
Run Code Online (Sandbox Code Playgroud)

人们说delphi使用copy-on-write来表示字符串.但上面的函数为变量,r,s和Result打印3个不同的地址.所以这很令人困惑..内存中是否只有'Hello'字符串的副本?

delphi string

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

操作系统如何将所有内核用于我的应用程序?

我有一个用柏林德尔福101写的COM.我编写了一个脚本来调用它的API(只有一个API,单线程,每个需要大约1分钟才能完成).

我使用cscript.exe(64位)运行vbs文件(我在这里使用简单的作业运行器),同时使用许多副本(因此有很多进程).

但是,我已经在许多PC(Windows 10 Pro)上进行了测试,并且观察到只有大约1个核心正在运行,尽管它有许多核心.

例如,在我的2个CPU(HPZ800 Intel Xeon X5650,每个6个核心= 12个核心)上,只使用了1个核心.

如果某些脚本提前退出,则其余的CPU使用率将得到改善,但总共不超过1个核心.

我的问题是,如何编写代码以便从多核中受益?

在此输入图像描述

multicore

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

退出(1)或结果之间是否有任何区别:= 1; 在德尔福退出?

在Delphi中,您可以退出函数并为其提供一个返回值,该值与C/C++/Java/C#等中的return关键字非常相似.

Exit(1);
Run Code Online (Sandbox Code Playgroud)

但是,我通常写这样的东西:

Result := 1;
Exit;
Run Code Online (Sandbox Code Playgroud)

有没有理由选择一个而不是另一个?

delphi

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

我应该使用哪一个为Delphi,NativeUInt或NativeInt进行64位指针数学运算

由于有64位delphi编译器,我们应该使用64位指针.

如果我们使用nativeint或nativeuint,那么想知道有什么区别.例如,

我应该用吗?

Pointer(NativeUInt(Pointer(Buffer)) + LongWord(datawrote))^,
Run Code Online (Sandbox Code Playgroud)

要么

Pointer(NativeInt(Pointer(Buffer)) + LongWord(datawrote))^,
Run Code Online (Sandbox Code Playgroud)

有关系吗?哪个风格更好?

delphi pointers

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