能力值:
( LV15,RANK:930 )
|
-
-
2 楼
fopen 的返回值是一个结构指针,其内存是在堆中的动态分配的。值每次都可能都不同
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
但是汇编形式的fopen有问题,后面用fwrite往文件写入数据,文件大小还是为0,而第一种形式就没问题
我估计是这样,这两个fopen是不同的函数,
stream = fopen( "c:\\update.exe", "wb" ); 并没有load msvcrt.dll
而第二个fopen是用的msvcrt.dll里的,那么第一个fopen是怎么来的呢
我用od看了下fopen( "c:\\test.exe", "wb" );
004010E3 |. 68 10304200 push 00423010 ; /mode = "wb"
004010E8 |. 68 80204200 push 00422080 ; |path = "c:\test.exe"
004010ED |. E8 BE010000 call fopen ; \fopen
下面提示 4012B0=fopen, 并不是0x77c0f010
|
能力值:
(RANK:410 )
|
-
-
4 楼
C带有两个运行库,一个是静态的,一个是动态的,第一个你使用的是静态库中的函数。
你的第二个函数不成功的原因我想可能是你那个硬编码出现的错误,函数最好不要使用硬编码,最好使用GetProcAddress获取再call。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
fopen返回的是一个文件结构体的指针,每次都是动态分配的,所以内容不一样
|
能力值:
(RANK:410 )
|
-
-
6 楼
测试了一下,静态库函数返回的地址和动态库函数返回的地址不能通用,静态库函数返回的地址只能使用静态库函数fwrite操作,动态库函数返回的地址只能通过动态库函数的fwrite操作。操成这个原因可能是因为像这些fopen等函数内部使用了某些全局的变量,所以静态库的函数不能和动态库的函数混合使用。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
原来如此,感谢~
|
|
|