是否可以通过OleVariant类型获取COM对象的成员列表(属性,函数,过程)?
例如,
var
wscript: Olevariant;
begin
wscript := CreateOleObject("WScript.Shell");
...
end;
Run Code Online (Sandbox Code Playgroud)
我特别感兴趣的是获取WScript.Echo,WScript.Quit等功能列表.
我想拥有此功能,因为它可以实现代码自动完成.
在Delphi中,LongInt和Integer,LongWord和Cardinal有什么区别?
有时我会发现DWORD的用法,它是什么?
它们在所有版本的Delphi中是否一致?我应该坚持哪一个?
我试图运行以下,
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代码
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),都不会工作.
在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)
哪一个在性能方面更好?
我想实现一些足够快的排序算法,可以多次排序500个数字(例如每次排序500个数字的300次迭代)
我不喜欢快速排序,合并排序,因为它们比冒泡排序,选择排序,插入排序更难实现.
只是想知道什么是最好的(简单的实现和一些最佳情况复杂度小于O(N 2),如果已经排序了很多数字)在这种情况下最简单的排序算法
要排序的数字是双打的类型.
我有这样的代码:
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'字符串的副本?
我有一个用柏林德尔福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个核心.
我的问题是,如何编写代码以便从多核中受益?
在Delphi中,您可以退出函数并为其提供一个返回值,该值与C/C++/Java/C#等中的return关键字非常相似.
Exit(1);
Run Code Online (Sandbox Code Playgroud)
但是,我通常写这样的东西:
Result := 1;
Exit;
Run Code Online (Sandbox Code Playgroud)
有没有理由选择一个而不是另一个?
由于有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)
有关系吗?哪个风格更好?