相关疑难解决方法(0)

如何在Delphi中动态调用命名过程或函数

我正在尝试动态调用驻留在函数表中的过程或函数的能力.特定的应用程序是一个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)

delphi dll function

9
推荐指数
2
解决办法
1902
查看次数

Delphi 64位asm编译错误

以下函数不使用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)

delphi assembly fpu 32bit-64bit delphi-xe2

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

Simd Matmul程序给出不同的数值结果

我正在尝试使用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)

c floating-point simd vectorization avx

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