我正在尝试动态调用驻留在函数表中的过程或函数的能力.特定的应用程序是一个DLL,它导出一个指向函数表的指针以及有关参数和类型数量的信息.然后,宿主应用程序能够查询DLL并调用函数.如果它们是对象方法,我可以使用Rtti来调用它们,但它们是正常的过程和函数.DLL必须导出普通函数指针而不是对象,因为DLL可以用任何语言编写,包括C,Delphi等.
例如,我在DLL中声明并填写了一条记录:
TAPI = record
add : function (var a, b : double) : double;
mult : function (var a, b : double) : double;
end;
PAPI = ^TAPI;
Run Code Online (Sandbox Code Playgroud)
我检索指向此记录的指针,声明为:
apiPtr : PAPI;
Run Code Online (Sandbox Code Playgroud)
假设我还可以访问记录中每个条目的过程名称,参数数量和参数类型.
假设我想调用add函数.要添加的函数指针将是:
@apiPtr^.add // I assume this will give me a pointer to the add function
Run Code Online (Sandbox Code Playgroud)
我假设除了使用一些asm来推送堆栈上的必要参数并检索结果之外别无他法.
第一个问题,将程序声明为cdecl的最佳调用约定是什么?在通话之前组装堆栈似乎最简单.
第二个问题,网上是否有任何实际可行的例子?我遇到了http://www.swissdelphicenter.ch/torry/showcode.php?id=1745(DynamicDllCall),它接近我想要的但我简化如下,它现在返回一个指针(EAX)到结果:
function DynamicDllCall(proc : pointer; const Parameters: array of Pointer): pointer;
var x, n: Integer;
p: Pointer;
begin
n := High(Parameters);
if n > -1 then begin …Run Code Online (Sandbox Code Playgroud) 以下函数不使用64位Delphi XE2编译器进行编译.(错误都与fld指令有关.)
[dcc64 Error] Project1.dpr(12): E2116 Invalid combination of opcode and operands
[dcc64 Error] Project1.dpr(13): E2116 Invalid combination of opcode and operands
[dcc64 Error] Project1.dpr(20): E2116 Invalid combination of opcode and operands
Run Code Online (Sandbox Code Playgroud)
第12和13行:
fld Y
fld X
Run Code Online (Sandbox Code Playgroud)
第20行:
fld X
Run Code Online (Sandbox Code Playgroud)
不幸的是我没有装配技能,而且我正在使用第三方代码,我需要将其移植到64位.你能帮助我使它在32位和64位上工作吗?
function PartArcTan(Y, X: Extended): Extended;
asm
fld Y // st(0) = Y
fld X // st(0) = X
fpatan // st(0) = ArcTan(Y, X)
fwait
end;
function ArcSin(X: Extended): Extended; // -1 <= X <= 1
asm …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用simd内部函数在C中编程矩阵乘法。我非常确定自己的实现,但是执行时,我会从所得矩阵系数的第5位开始出现一些数字错误。
REAL_T只是具有typedef的浮点数
/* This is my matmul Version with simd, using floating simple precision*/
void matmul(int n, REAL_T *A, REAL_T *B, REAL_T *C){
int i,j,k;
__m256 vA, vB, vC, vRes;
for (i=0; i<n; i++){
for (j=0; j<n; j++){
for (k=0; k<n; k= k+8){
vA = _mm256_load_ps(&A[i*n+k]);
vB = _mm256_loadu_ps(&B[k*n+j]);
vC = _mm256_mul_ps(vA, vB);
vC = _mm256_hadd_ps(vC, vC);
vC = _mm256_hadd_ps(vC, vC);
/*To get the resulting coefficient, after doing 2 hadds,
I have to get the first and the last element …Run Code Online (Sandbox Code Playgroud) delphi ×2
32bit-64bit ×1
assembly ×1
avx ×1
c ×1
delphi-xe2 ×1
dll ×1
fpu ×1
function ×1
simd ×1