Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image My exists函数表示文件存在,但winapi函数表示文件不存在_Image_File_Winapi - Fatal编程技术网

Image My exists函数表示文件存在,但winapi函数表示文件不存在

Image My exists函数表示文件存在,但winapi函数表示文件不存在,image,file,winapi,Image,File,Winapi,我抄了。我的程序中有一个常数: const char * image_name = "button_out.gif"; 稍后,我使用Magick++将图像写入磁盘: image.write(image_name); 图像显示在程序的工作目录中。如果我直接从资源管理器运行程序,工作目录等于程序位置 由于代码打印0x80070002-找不到文件错误,因此我在开头添加了exist函数: #include <sys/stat.h> bool exists(const char* nam

我抄了。我的程序中有一个常数:

const char * image_name = "button_out.gif";
稍后,我使用
Magick++
将图像写入磁盘:

image.write(image_name);
图像显示在程序的工作目录中。如果我直接从资源管理器运行程序,工作目录等于程序位置

由于代码打印
0x80070002-找不到文件
错误,因此我在开头添加了exist函数:

#include <sys/stat.h>
bool exists(const char* name) {
  struct stat buffer;   
  return (stat (name, &buffer) == 0); 
}
void  SetWallpaper(LPCWSTR file){
  if(!exists((const char* )file)) {
    wcout << "The file "<<file<<" does not exist!" << endl;  
  return;
  ... actually try to set a wallpaper ...
}
#包括
bool存在(常量字符*名称){
结构统计缓冲区;
返回(stat(name和buffer)==0);
}
无效设置墙纸(LPCWSTR文件){
如果(!存在((常量字符*)文件)){
wcout问题1:字符串转换
您的主要问题是您试图交替使用
LPCWSTR
(a
const wchar\u t*
)和
const char*
。我在您的源代码中看到了一些问题,特别是:

  • 您可以从
    const char*image\u name
    开始
  • 然后将其强制转换为
    LPCWSTR
    以传递给
    SetWallpaper
    。这基本上保证了
    SetWallpaper
    将失败,因为
    desktop->SetWallpaper
    无法处理非宽字符串
  • 然后将其转换回
    const char*
    以通过
    exists()
    传递到
    stat()
    。这在您的情况下应该可以工作(因为原始字符串实际上是
    char*
    ),但不正确,因为
    setwallper
    的字符串参数应该是正确的
    LPCWSTR
您需要选择一种字符串格式(宽字符与Windows术语“ANSI”)并坚持该格式,在整个过程中使用一致的API

最简单的选择可能只是保留大部分代码不变,但修改
SetWallpaper
以获取
const char*
,并在需要时转换为宽字符串(为此,您可以使用)。例如:

void  SetWallpaper(const char * file){  // <- Use a const char* parameter.
   ...

   // Convert to a wide-character string to pass to COM: 
   wchar_t wcfile[MAX_PATH + 1];
   mbstowcs(wcfile, file, sizeof(wcfile) / sizeof(wchar_t));

   // Pass the converted wide-character string:
   desktop->SetWallpaper(wcfile, 0);

   ...
}
void setwallpap(const char*file){//setwallpap(wcfile,0);
...
}
另一种选择是在整个过程中使用宽字符串,即:

  • LPCWSTR image\u name=L“button\u out.gif”;
  • 修改
    exists()
  • 使用所有其他API函数的宽字符版本
但是,我不确定这将如何与ImageMagick API交互,后者可能没有广泛的字符支持。因此,这取决于您。选择最容易实现的方法,但确保一致性。一般规则是不要在
LPCWSTR
const char*
之间转换;如果您是我的话在需要将一个更改为另一个的情况下,您不能强制转换,您必须转换(通过
mbstowcs
wcstombs

问题2:SetWallpaper默认目录不是当前工作目录 此时,您的字符串用法将保持一致。现在您已经解决了这个问题,如果
setwallper
存在时失败()
没有,那么
setwallper
就看不到你认为它在哪里。正如你在评论中发现的那样,
setwallper
默认在桌面上看。在这种情况下,虽然我没有测试过它,但你可以通过将绝对路径传递到
setwallper
来解决这个问题。为此,你可以使用ine是给定相对路径的绝对文件名。但请记住与字符串类型保持一致

此外,如果
stat()
继续失败,则问题可能是您的工作目录不是您所认为的,或者您的文件名不是您所认为的。为此,您需要执行以下测试:

  • 在检查文件是否存在时打印当前工作目录,并验证其是否正确
  • 检查文件名是否存在时,请打印文件名,并验证其是否正确
一旦你解决了以上所有问题,你就可以开始了。

问题1:字符串转换 您的主要问题是您试图交替使用
LPCWSTR
(a
const wchar\u t*
)和
const char*
。我在您的源代码中看到了一些问题,特别是:

  • 您可以从
    const char*image\u name
    开始
  • 然后将其强制转换为
    LPCWSTR
    以传递给
    SetWallpaper
    。这基本上保证了
    SetWallpaper
    将失败,因为
    desktop->SetWallpaper
    无法处理非宽字符串
  • 然后将其转换回
    const char*
    以通过
    exists()
    传递到
    stat()
    。这在您的情况下应该可以工作(因为原始字符串实际上是
    char*
    ),但不正确,因为
    setwallper
    的字符串参数应该是正确的
    LPCWSTR
您需要选择一种字符串格式(宽字符与Windows术语“ANSI”)并坚持该格式,在整个过程中使用一致的API

最简单的选择可能只是保留大部分代码不变,但修改
SetWallpaper
以获取
const char*
,并在需要时转换为宽字符串(为此,您可以使用)。例如:

void  SetWallpaper(const char * file){  // <- Use a const char* parameter.
   ...

   // Convert to a wide-character string to pass to COM: 
   wchar_t wcfile[MAX_PATH + 1];
   mbstowcs(wcfile, file, sizeof(wcfile) / sizeof(wchar_t));

   // Pass the converted wide-character string:
   desktop->SetWallpaper(wcfile, 0);

   ...
}
void setwallpap(const char*file){//setwallpap(wcfile,0);
...
}
另一种选择是在整个过程中使用宽字符串,即:

  • LPCWSTR image\u name=L“button\u out.gif”;
  • 修改
    exists()
  • 使用所有其他API函数的宽字符版本
但是,我不确定这将如何与ImageMagick API交互,因为它可能没有广泛的字符支持。因此,这取决于您。选择最容易实现的方法,但请确保您是c