小编Ale*_*nze的帖子

如何在构造函数中中断组件?

我想在组件无法加载时向条件状态添加条件状态,并告知其用户(开发人员)该组件无法在设计时加载并在运行时以目标用户加载(如果可能的话,安全地以某种方式安全).

如何防止组件在其构造函数中加载以及如何在设计时和运行时安全地显示构造函数中的消息(异常)?

constructor TSomeComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  if csDesigning in ComponentState then
    if SomeIncompatibleCondition then
      begin
        // how to display message (exception) about the wrong 
        // condition and interrupt the loading of the component ?
      end;

  // is it possible to do the same at runtime ?
end;
Run Code Online (Sandbox Code Playgroud)

谢谢

delphi constructor components delphi-2009

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

师8086/8087 1/3 = 3?

我有一个很大的问题fdiv!!!! 我试图划分1/3所以这就是我所做的

.model small
.stack 100h 
.data 

var1 dd 1
var2 dd 3 
var3 dd 2
resultado dt 0.0

.code 

mov ax,@data 
mov ds,ax 
finit 
fild var1
fild var2
fdiv
fstp resultado
ffree 

.exit 
Run Code Online (Sandbox Code Playgroud)

你可以看到我将结果移动到resultado因为我看不到结果st(0)(我正在使用tasm所以我只能在调试器中看到变量)结果应该是3EAAAA3A但我得到了40400000...那就是3!!! 这怎么可能??我试过交换变量而没有!你能帮助我吗??=(

x86 assembly fpu tasm x87

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

无法从MSR回读

我正在编写一个内核模块,它是关于读写MSR的.我写了一个简单的测试程序,但它仍然失败.它所做的只是写入MSR,然后再读回来.这是代码:

static int __init test3_init(void)
{
    uint32_t hi,lo;
    hi=0; lo=0xb;
    asm volatile("mov %0,%%eax"::"r"(lo));
    asm volatile("mov %0,%%edx"::"r"(hi));
    asm volatile("mov $0x38d,%ecx");
    asm volatile("wrmsr");
    printk("exit_write: hi=%08x lo=%08x\n",hi,lo);
    asm volatile("mov $0x38d,%ecx");
    asm volatile("rdmsr":"=a"(lo),"=d"(hi));
    printk("exit_write2: hi=%08x lo=%08x\n",hi,lo);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

exit_write: hi=00000000 lo=0000000b

exit_write2: hi=00000000 lo=00000000

有人能告诉我为什么第二个输出中的返回值为0,而不是原始值?我的代码有问题吗?非常感谢.

c x86 assembly gcc inline-assembly

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

如何枚举内核中指定进程的所有打开句柄(Windows)

我有一个内核驱动程序.如何在内核驱动程序中枚举指定进程的所有打开句柄?我想关闭这些句柄.

谢谢!

c windows kernel handle

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

使用方括号读取NASM中的值时,默认段寄存器是什么?

众所周知,我们可以在NASM中使用方括号读取地址的值,例如:

mov esi,  [ebp +8]
mov edi, [var]   -->  (var is a variable)
Run Code Online (Sandbox Code Playgroud)

方括号中的那些值表示偏移地址,但是当我们使用该格式读取值时,我们绝对需要一个段,无论我们处于实际模式还是受保护模式,那么NASM使用的默认段寄存器是什么?我知道Windows使用平面模式,但如果我为不同的段寄存器(cs,ss,ds,es,fs,gs)设置不同的值,NASM会使用哪个段寄存器?我想是的ds,对吧?在方括号中使用不同的表达式时,段寄存器是否不同?在实际模式和保护模式下,默认段注册是否相同?谢谢.

x86 assembly nasm

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

C ++双重除法和返回

我了解双打只是近似值。但是我很惊讶

double f(int x, int y)
{
    return double(x)/y;
}
Run Code Online (Sandbox Code Playgroud)

double f(int x, int y)
{
    double z = double(x)/y;
    return z;
}
Run Code Online (Sandbox Code Playgroud)

可以返回不同的值。有人知道为什么吗?

c++ floating-point

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

ds:esi + ecx + 7 - >汇编语言意味着什么?

ds:esi+ecx+7在汇编语言中意味着什么?

任何人都可以解释一下这句话的含义......?

ds:esi+ecx+7
Run Code Online (Sandbox Code Playgroud)

这是任何变量声明或任何其他东西..

我在本汇编代码中找到了它

xor [ds:esi+ecx+7],cl
Run Code Online (Sandbox Code Playgroud)

所以请解释这个陈述的实际含义......

x86 assembly

0
推荐指数
1
解决办法
1052
查看次数

我们如何在 16 位中使用 `e[]x` 而在 32 位中不使用 `r[]x`

那么在汇编中,如何e[]x在16位实模式下可以使用,而r[]x在32位模式下不能使用呢?例如:

BITS 16
mov bx, 1
mov eax, 2
Run Code Online (Sandbox Code Playgroud)

将在 IDA 中正确组装和反汇编(在 16 位模式下)。它可以工作,因为我之前已经反汇编了 Win2k 引导加载程序并找到了eax.

但是,为什么即使在无法访问的受保护模式下的 64 位处理器上也无法访问r[]x

x86 assembly x86-64

0
推荐指数
1
解决办法
257
查看次数

如何从字符串中存储和检索char*?

const char *RecBuffer, int *packetLength 指向数据和大小

    string packet(RecBuffer,*packetLength);//store here
     ...do some stuff
    RecBuffer = packet.c_str();//retrieve it later
Run Code Online (Sandbox Code Playgroud)

现在发生的事情是我的Recbuffer包含大量的浮点数,并且我将收到的数据包作为UDP数据包收到.但是当我从字符串中存储和检索它时,它包含垃圾.

我哪里错了?

c++ stl

0
推荐指数
1
解决办法
104
查看次数

为什么我在这里得到两个不同的输出?

以下两段代码产生两种不同的输出.

//this one gives incorrect output
cpp_dec_float_50 x=log(2)
std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits)<< x << std::endl;
Run Code Online (Sandbox Code Playgroud)

它给出的输出是

0.69314718055994528622676398299518041312694549560547

这是唯一正确的小数点后15位.如果x是双倍的话,即便如此,我们也会得到前15位正确的数字.似乎结果溢出了.我不知道为什么它应该.cpp_dec_float_50应该具有50位精度.

//this one gives correct output
cpp_dec_float_50 x=2
std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits)<< log(x) << std::endl;
Run Code Online (Sandbox Code Playgroud)

它给出的输出是

0.69314718055994530941723212145817656807550013436026

根据wolframaplha这是正确的.

c++ floating-point boost

0
推荐指数
1
解决办法
86
查看次数