在MQL5中,总是有漏洞可钻! ;) - 页 2

 
sergeev:

因此有了第一个问题。

如何从32位的dll,如user32.dll等导入函数 到64位的应用程序中?还是在系统中存在具有该名称的副本并创建了一个OOP空间?

首先,x64系统有模拟的x86程序的启动。问题是如何在X86中运行X64程序?
 
Urain:
那么,首先,x64系统有模拟启动x86程序的功能。问题是如何在X86中运行X64程序?

也许问题根本不是关于终端,而是关于这些非常DLLs的一些棘手的编译?

这些DLL是由Windows API提供的,例如32/64位终端中的user32、kernel32、winmm、wininet。

问题的解决方案似乎在于其他地方。

 
Urain:
问题是如何在X86中运行X64程序?
这肯定行不通。X86处理器不能执行64位指令。
sergeev:

也许问题根本不是关于终端,而是关于这些DLLs的一些棘手的编译问题?

例如,user32、kernel32、winmm、wininet可以在32/64位终端工作。

解决这个问题的办法似乎在于其他方面。

因此,从理论上讲,你可以使32位DLLs在那里和那里工作。

也许现在是时候给开发商打电话了。

也许有更狡猾的编译方式//我停止了在x64上以 "天真 "方式编译的32位DLL的工作。 无论如何,有先例 "存在"(c)。

例如,32/64位终端中的user32、kernel32、winmm、wininet。

 
MetaDriver:

所以用这个比喻来做......没什么大不了的!......。:-))

我去看看。;)

//+------------------------------------------------------------------+
class Cdouble
{
public:
        double                  v;
        void    operator=       (double d) {v=d;}
};
//+------------------------------------------------------------------+
class C1Xdouble
{
        Cdouble                 v[];
public:
        
                                C1Xdouble() {}
                                C1Xdouble(int s) {ArrayResize(v,s);}
                               ~C1Xdouble(){ ArrayFree(v);}
        double operator[]       (int x) {return(v[x].v);}
        Cdouble *operator[]    (long x){return(GetPointer(v[(int)x]));}
        int                     Resize(int s){ return(ArrayResize(v,s));}
};
//+------------------------------------------------------------------+
class C2Xdouble
{
        C1Xdouble               v[];
public:
                                C2Xdouble() {}
                                C2Xdouble(int s1,int s2);
                               ~C2Xdouble(){ ArrayFree(v);}
        C1Xdouble *operator[]   (int x) { return(GetPointer(v[x]));}
};
C2Xdouble::C2Xdouble(int s1,int s2)
{
        ArrayResize(v,s1);
        for(int i=0; i<s1; i++) v[i].Resize(s2);
}
//+------------------------------------------------------------------+
最简单的方法是将其应用于你的案件。
 
Yurich:
最简单的版本,适合你的情况。

那么,对于最简单的情况,信用。"我把你写下来":)

根据记忆,但相比之下,并不稀奇。

    C2Xdouble  X(1000,1000);
    Print("X(100,100).SizeOF() = ",X.SizeOf()); 
// добавил в ваши классы вычисление размера
-----
    C2DMagicArray  MA(1000,1000);
    Print("MA(100,100).SizeOF() = ",sizeof(MA)+MA.SizeOf()); 
// это мой. у меня MA.SizeOf() возвращает только размер чистого буфера, поэтому по честному добавил размер класса. :)

结果。

2012.05.23 12:59:05     CXDouble (AUDNZD,M1)    MA(100,100).SizeOF() = 4000112
2012.05.23 12:59:05     CXDouble (AUDNZD,M1)    X(100,100).SizeOF() = 24068068

考虑到我有一个浮动的缓冲区--3倍,差距是6倍。 // 你也有一个隐性的内存劫--你的系统表的类描述符(在这个例子中)是1000*1000+1000,而我的是1(!)

速度几乎相同。

你会不会缩水?;)

--

我撒谎了,你的子类都是静态的,所以隐性的抢劫有点夸张了。划掉这个。:)

 
MetaDriver:

也许现在是时候给开发商打电话了。
简而言之。
x86(32位)进程的系统库函数有一个特殊的包装,通过它传递给x64,执行后返回给x86。
 
mql5:
简而言之。
x86(32位)进程的系统库函数有一个特殊的包装器,通过它被转移到x64,执行并返回到x86。

谢谢你提供的信息。

你能告诉我如何在你自己身上做同样的事情吗? 只要有一个链接(如果有的话)。

 
MetaDriver:


你会不会缩水?;)

不,我尽可能地使用一维数组。
 
#ifdef不是解决这个问题的正常方法吗?
 
Yurich:
不,我尽可能地使用一维数组。

好的。在这种情况下,优化问题是次要的。 无论如何,这一壮举是被捍卫的。

--

我可以为你提供以下问题。

数组具有任意的维度(为了清楚起见,我们把它限制为^16)。

维度是在创建时通过参数的数量来设置的,和通常的数组一样。

XXArray  xx2(5,7),  xx5(12,12,16,16,8);

应该对所有尺寸的索引器都有效( A[i][j][k][n][m]....)

只是为了运动和大脑训练。:)
原因: