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
(aconst 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
(aconst 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