回调函数 ( 积分: 50 )

  • 主题发起人 主题发起人 sjjwan
  • 开始时间 开始时间
S

sjjwan

Unregistered / Unconfirmed
GUEST, unregistred user!
function EnumWndProc(Hwnd : THandle;FoundWnd : string): Bool;
begin
showmessage('ksk');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@EnumWndProc,90)
end;
这样居然编译通过,而且运行不出错
但是我加Stdcall,运行就出错,说是内存访问错误
这是怎么回事啊?
 
function EnumWndProc(Hwnd : THandle;FoundWnd : string): Bool;
begin
showmessage('ksk');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@EnumWndProc,90)
end;
这样居然编译通过,而且运行不出错
但是我加Stdcall,运行就出错,说是内存访问错误
这是怎么回事啊?
 
很简单, 不加stdcall时由于编译器认为是register调用的, 所以FoundWnd是在寄存器里, 由于过程中没有使用到FoundWnd变量, 因此没有生成语句对其进行操作, 因此你调用看上去没有问题. 加了stdcall之后FoundWnd是调用者压入堆栈的变量, 由于FoundWnd被定义为string, 所以会生成操作string引用记数的语句, 在程序退出EnumWndProc时尝试修改这个string的引用记数看是否需要释放该string, 针对你的例子来说会读写绝对地址82处的内存, 当然就产生异常啦
 
Another_eYes
我觉的你对理论应该瞒懂的
我想问你一下
 计算机高级语言跟操作系统有没关系的?  
  编译程序是不是要在操作系统上才能运行的?
  在开发出一种高级语言时,指的是什么意思,就是开发编译器吗?
  为什么说C语言能操作硬件,是不是说C语言里库函数能操作硬件吗?
  没有操作系统,程序就不能在上面跑.那在没有操作系统之前,程序是怎么运行的    啊?
  BIOS程序,硬件驱动程序跟操作系统有什么关系啊?
  CPU,内存,要驱动程序吗?
  第一个操作系统是不是只能用机器语言写的?后来就出现了高级语言?
  象C语言里库函数是不是调用API函数的
还有比如说
var x:string;
x:='sjj';
edit1.text:=x;
你说这样是不是不好,浪费内存啊,因为我定义一个变量,就要一定的内存啊
还不如直接写edit1.text:=sjj'';
对吗?
 
计算机高级语言跟操作系统有没关系的?
有  

编译程序是不是要在操作系统上才能运行的?


在开发出一种高级语言时,指的是什么意思,就是开发编译器吗?
可以这么说

为什么说C语言能操作硬件,是不是说C语言里库函数能操作硬件吗?
一般操作硬件的都是操作系统或硬件驱动, 只是看库函数是否提供了到操作系统/驱动程序的这种接口

没有操作系统,程序就不能在上面跑.那在没有操作系统之前,程序是怎么运行的    啊?
是机器指令呀

BIOS程序,硬件驱动程序跟操作系统有什么关系啊?
是构建操作系统的基石

CPU,内存,要驱动程序吗?
广义上: 要, 如果你把主板线路, bios程序等也理解成驱动的话
一般意义上: 不要

第一个操作系统是不是只能用机器语言写的?后来就出现了高级语言?


var x:string;
x:='sjj';
edit1.text:=x;
你说这样是不是不好,浪费内存啊,因为我定义一个变量,就要一定的内存啊
还不如直接写edit1.text:=sjj'';
对生成的可执行程序来说两种写法完全一样, 因为edit1.text:='sjj'也会先把'sjj'赋给一个临时变量或寄存器, 而定义的局部变量var x: string并不一定分配了内存, delphi编译器可能只把某个寄存器作为了这个局部变量. 但是c/c++的相应语句则具体分配了内存除非使用了inline修饰词, 由于这块内存是在堆栈中, 因此申请/释放的开销可以忽略(除非是GB级的循环才需要考虑这种开销)
 
Another_eYes
你的回答,我非常的满意!实在太谢谢你了
我上面的一个问题,就是在没有操作系统之前,应用程序是怎么运行的呀?
应用程序不是直接跟硬件打交道的呀,如果它需要硬件资源,不是只能通过操作系统吗?
那如果没有操作系统之前,应用程序能在裸机上跑吗?
还有,你说高级语言跟操作系统有关,那它怎么开发出WINDOWS操作系统来啊?
 
传说中的高手啊......[:D]终于看见了.
 
楼主看样子不是科班出身的吧,这些问题只要读过计算机相关专业大二的应该都能理解了.加油哦.
对"cpu,内存需要驱动吗?"回答有些补充(不知道对不对哈)
cpu在windows系统里面也是需要驱动的,只不过是windows默认的驱动而已.
你想想,要是不需要驱动,只通过bios,那么dos也能支持64位处理器了.
 
内存应该说是不需要驱动的.但是CPU这个有待商榷.这个所谓的驱动和普通设备的驱动不是一回事.他应该是一个HAL的概念。也没有实际的驱动程序文件存在。至于DOS,你写的DOS程序,如果需要利用64位的指令.我想应该是没问题的.
至于内存的访问.DOS处于实模式,自然有限制,而Windows/Linux/MACOS虽然需要一些代码来处理,但是这是并不是面向内存的,而是面向CPU的.
 
后退
顶部