| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 549 人关注过本帖
标题:差不多的代码 为啥在 delphi 下能正确运行 在 c 的控制台下就不行呢 出现 ...
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:9 
差不多的代码 为啥在 delphi 下能正确运行 在 c 的控制台下就不行呢 出现内存访问错误 错误原因是差在 父窗口句柄呢 还是差在宽窄字符的处理上
程序代码:
#include <stdio.h>
#include <windows.h>

int main()
{
    char strsrc[]="d:\\123.txt";
    SHFILEOPSTRUCT lpfileop;
    lpfileop.hwnd=NULL;
    lpfileop.wFunc=FO_DELETE;
    lpfileop.pFrom=strsrc;
    lpfileop.fFlags=FOF_ALLOWUNDO;
    lpfileop.hNameMappings=NULL;
    lpfileop.fAnyOperationsAborted=false;
    int nok=SHFileOperation(&lpfileop);
    if(nok) printf("出现了错误\n");else printf("文件被成功删除到了回收站\n");
    return 0;
}
/*
  delphi7下能够成功运行的代码

  procedure TForm1.Button1Click(Sender: TObject);
  var
    lpFileOp: TSHFileOpStruct;
  begin
    lpFileOp.Wnd := Application.Handle;
    lpFileOp.wfunc := FO_DELETE;
    lpFileOp.pFrom := pchar('d:\123.txt');
    lpFileOp.fFlags := FOF_ALLOWUNDO;
    lpFileOp.hNameMappings :=nil;
    lpFileOp.lpszProgressTitle :=nil;
    lpFileOp.fAnyOperationsAborted :=false;
    SHFileOperation(lpFileOp);
  end;
*/
2014-05-01 10:48
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:16 
只曾分
2014-05-01 18:01
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:17 
WCHAR strsrc[] = L"D:\\123.txt\0";


[fly]存在即是合理[/fly]
2014-05-01 18:21
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:17 
继续 蹭了个分

未知令人期待!
2014-05-01 18:51
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用azzbcc在2014-5-1 18:21:35的发言:

WCHAR strsrc[] = L"D:\\123.txt\0";



WCHAR strsrc[]=L"d:\\123.txt\0";  使用多字节字符集   这句编译过不去
                                  改成UNICODE字符集  可以编译  但是运行出现错误  

改成wchar_t strsrc[]=L"d:\\123.txt\0";  也一样无效

DO IT YOURSELF !
2014-05-01 18:57
上苍之手
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:314
专家分:1451
注 册:2012-11-24
收藏
得分:50 
程序代码:
#include <stdio.h>
#include <windows.h>

int main()
{
    char strsrc[]="d:\\123.txt\0\0";
    SHFILEOPSTRUCT lpfileop;
    lpfileop.hwnd=NULL;
    lpfileop.wFunc=FO_DELETE;
    lpfileop.pFrom=strsrc;
    lpfileop.pTo=NULL;
    lpfileop.fFlags=FOF_ALLOWUNDO;
    lpfileop.hNameMappings=NULL;
    lpfileop.fAnyOperationsAborted=0;
    int nok=SHFileOperation(&lpfileop);
    if(nok) printf("出现了错误\n");else printf("文件被成功删除到了回收站\n");
    return 0;
}
这样呢。

扬起风帆,从此自信远航。。。。。
2014-05-01 19:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用上苍之手在2014-5-1 19:36:06的发言:

#include <stdio.h>
#include <windows.h>

int main()
{
    char strsrc[]="d:\\123.txt\0\0";
    SHFILEOPSTRUCT lpfileop;
    lpfileop.hwnd=NULL;
    lpfileop.wFunc=FO_DELETE;
    lpfileop.pFrom=strsrc;
    lpfileop.pTo=NULL;
    lpfileop.fFlags=FOF_ALLOWUNDO;
    lpfileop.hNameMappings=NULL;
    lpfileop.fAnyOperationsAborted=0;
    int nok=SHFileOperation(&lpfileop);
    if(nok) printf("出现了错误\n");else printf("文件被成功删除到了回收站\n");
    return 0;
}这样呢。



  厉害,这个把项目属性修改成多字节字符集  能够成功的运行 并得到正确的结果
但网上搜到的资料都是一个\0

DO IT YOURSELF !
2014-05-01 19:43
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
那就差在 \0 上了

在UNICODE字符集下  这样也可以运行的 wchar_t strsrc[]=L"d:\\123.txt\0\0";

DO IT YOURSELF !
2014-05-01 20:11
上苍之手
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:314
专家分:1451
注 册:2012-11-24
收藏
得分:0 
回复 8 楼 wp231957
pTo要设置为NULL,若不设置为NULL,我用gdb调试时发现他指向不合法的内存地址。

扬起风帆,从此自信远航。。。。。
2014-05-01 20:17
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用上苍之手在2014-5-1 20:17:12的发言:

pTo要设置为NULL,若不设置为NULL,我用gdb调试时发现他指向不合法的内存地址。



确实如此:

经过测试代码:
#include <stdio.h>
#include <windows.h>

int main()
{
    char strsrc[]="d:\\123.txt\0\0";   //这里至少一个\0 二个\0也行
    SHFILEOPSTRUCT lpfileop;
    lpfileop.hwnd=NULL;
    lpfileop.wFunc=FO_DELETE;
    lpfileop.pFrom=strsrc;
    lpfileop.pTo=NULL;                  //这句代码被注释掉的话  绝对不行
    lpfileop.fFlags=FOF_ALLOWUNDO;
    lpfileop.hNameMappings=NULL;
    lpfileop.fAnyOperationsAborted=0;
    int nok=SHFileOperation(&lpfileop);
    if(nok) printf("出现了错误\n");else printf("文件被成功删除到了回收站\n");
    return 0;
}

DO IT YOURSELF !
2014-05-05 15:06
快速回复:差不多的代码 为啥在 delphi 下能正确运行 在 c 的控制台下就不行呢 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060095 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved