CopyFileEx函数传参问题

时间:2022-10-01 18:49:25
  ①  fileParam.lpNewFileName="d:\\Asset\\"+oDlg.GetFileName();
  ②  fileParam.lpNewFileName="d:\\Asset\\123.mpg";
我用②的时候是正确的,用①就不能完成copy,为啥呢

20 个解决方案

#1


oDlg.GetFileName()返回值为123.mpg

#2


lpNewFileName只是放的指针,没有复制内容
"d:\\Asset\\"+oDlg.GetFileName()的结果是个临时变量,执行完毕就释放了。
因此lpNewFileName等你用的时候就不知道指到什么地方去了

#3


引用 2 楼 bombzhang 的回复:
lpNewFileName只是放的指针,没有复制内容
"d:\\Asset\\"+oDlg.GetFileName()的结果是个临时变量,执行完毕就释放了。
因此lpNewFileName等你用的时候就不知道指到什么地方去了
那应该怎么改呢

#4


CString strFileName;
strFileName.Format(TEXT("d:\\Asset\\%s"),oDlg.GetFileName());
fileParam.lpNewFileName=strFileName;

前提是fileParam.lpNewFileName必须在strFileName被释放前使用,否则lpNewFileName又变成野指针了。

顺便问一下,fileParam是什么对象?

可不可以把char *lpNewFileName改成 char lpNewFileName[MAX_PATH]?
可以改的话就简单了:
strcpy(fileParam.lpNewFileName,"d:\\Asset\\"+oDlg.GetFileName());

#5


引用 4 楼 bombzhang 的回复:
CString strFileName;
strFileName.Format(TEXT("d:\\Asset\\%s"),oDlg.GetFileName());
fileParam.lpNewFileName=strFileName;

前提是fileParam.lpNewFileName必须在strFileName被释放前使用,否则lpNewFileName又变成野指针了。

顺……
fileParam是我定义的一个结构体,该结构体包含源文件路径和目的文件路径

#6


CFileDialog oDlg(TRUE,
_T("MPG file (*.mpg)"),
0,
OFN_HIDEREADONLY,
_T("文件类型 (*.mpg)|*.mpg||"),
0);

if(IDOK==oDlg.DoModal())
{
m_bTransport=false;
SetDlgItemText(IDC_INPUT_ASSET_BUTTON2,"取消");
//拷贝文件线程,拷贝完后button设为"导入",传递一个结构体
FILEPARAM* fileParam;
fileParam->lpNewFileName="d:\\Asset\\"+oDlg.GetFileName();
HANDLE hThread=AfxBeginThread(CopyFileThread,(LPVOID*)fileParam);}
这是我全部代码。

#7


那就把char *lpNewFileName改成 char lpNewFileName[MAX_PATH]
赋值的时候:
strcpy(fileParam.lpNewFileName,"d:\\Asset\\"+oDlg.GetFileName());

#8


漏了一句。
fileParam->lpExistingFileName=oDlg.GetPathName();

#9


这一句应该也不行吧
原因与lpNewFileName一样

#10


引用 9 楼 bombzhang 的回复:
这一句应该也不行吧
原因与lpNewFileName一样
恩。是的。兄台,你说的我道理我懂了,代码还是不会。。。

#11


多多动手练习,每个人都是从不会开始的

#12


error C2664: 'strcpy' : cannot convert parameter 1 from 'LPCTSTR' to 'char *'

#13


FILEPARAM的定义贴出来看看

#14


struct FILEPARAM
{
CString lpExistingFileName;
char lpNewFileName[MAX_PATH];//这是根据你的改的
// CString lpNewFileName;//这是原来我定义的
};

#15


fileParam->lpNewFileName=strFileName;就报这个错了
error C2440: '=' : cannot convert from 'CString' to 'char [260]'

#16


struct FILEPARAM
{
CString lpExistingFileName;
CString lpNewFileName;//这是原来我定义的
};
你原来把lpNewFileName定义成CString类型,那你原来的赋值方法应该没问题啊,我看到有个lp还以为是个指针。

FILEPARAM* fileParam;//没初始化?比如FILEPARAM* fileParam=new FILEPARAM;
fileParam->lpNewFileName="d:\\Asset\\"+oDlg.GetFileName();

#17


引用 16 楼 bombzhang 的回复:
struct FILEPARAM
{
CString lpExistingFileName;
CString lpNewFileName;//这是原来我定义的
};
你原来把lpNewFileName定义成CString类型,那你原来的赋值方法应该没问题啊,我看到有个lp还以为是个指针。

FILEPARAM* fileParam;//没初始化?比如FILEPARAM* filePa……
谢谢兄台。确实是没初始化。。

#18


引用 16 楼 bombzhang 的回复:
struct FILEPARAM
{
CString lpExistingFileName;
CString lpNewFileName;//这是原来我定义的
};
你原来把lpNewFileName定义成CString类型,那你原来的赋值方法应该没问题啊,我看到有个lp还以为是个指针。

FILEPARAM* fileParam;//没初始化?比如FILEPARAM* filePa……
确实是没初始化,可是为什么用②的时候不用初始化呢

#19


fileParam刚刚定义的时候是个随机指针,所以fileParam->lpNewFileName也是个随机指针,只是这个指针指向的地址是不确定的。
 fileParam.lpNewFileName="d:\\Asset\\123.mpg";//把一个常量字符串指针赋给lpNewFileName,所以可以用,但是说不定什么时候lpNewFileName就被修改了。

fileParam.lpNewFileName="d:\\Asset\\"+oDlg.GetFileName();//赋值结果指向一个临时CString变量,这个变量一释放字符串内容就没了。

#20


恩。谢谢兄台。明白了 CopyFileEx函数传参问题

#1


oDlg.GetFileName()返回值为123.mpg

#2


lpNewFileName只是放的指针,没有复制内容
"d:\\Asset\\"+oDlg.GetFileName()的结果是个临时变量,执行完毕就释放了。
因此lpNewFileName等你用的时候就不知道指到什么地方去了

#3


引用 2 楼 bombzhang 的回复:
lpNewFileName只是放的指针,没有复制内容
"d:\\Asset\\"+oDlg.GetFileName()的结果是个临时变量,执行完毕就释放了。
因此lpNewFileName等你用的时候就不知道指到什么地方去了
那应该怎么改呢

#4


CString strFileName;
strFileName.Format(TEXT("d:\\Asset\\%s"),oDlg.GetFileName());
fileParam.lpNewFileName=strFileName;

前提是fileParam.lpNewFileName必须在strFileName被释放前使用,否则lpNewFileName又变成野指针了。

顺便问一下,fileParam是什么对象?

可不可以把char *lpNewFileName改成 char lpNewFileName[MAX_PATH]?
可以改的话就简单了:
strcpy(fileParam.lpNewFileName,"d:\\Asset\\"+oDlg.GetFileName());

#5


引用 4 楼 bombzhang 的回复:
CString strFileName;
strFileName.Format(TEXT("d:\\Asset\\%s"),oDlg.GetFileName());
fileParam.lpNewFileName=strFileName;

前提是fileParam.lpNewFileName必须在strFileName被释放前使用,否则lpNewFileName又变成野指针了。

顺……
fileParam是我定义的一个结构体,该结构体包含源文件路径和目的文件路径

#6


CFileDialog oDlg(TRUE,
_T("MPG file (*.mpg)"),
0,
OFN_HIDEREADONLY,
_T("文件类型 (*.mpg)|*.mpg||"),
0);

if(IDOK==oDlg.DoModal())
{
m_bTransport=false;
SetDlgItemText(IDC_INPUT_ASSET_BUTTON2,"取消");
//拷贝文件线程,拷贝完后button设为"导入",传递一个结构体
FILEPARAM* fileParam;
fileParam->lpNewFileName="d:\\Asset\\"+oDlg.GetFileName();
HANDLE hThread=AfxBeginThread(CopyFileThread,(LPVOID*)fileParam);}
这是我全部代码。

#7


那就把char *lpNewFileName改成 char lpNewFileName[MAX_PATH]
赋值的时候:
strcpy(fileParam.lpNewFileName,"d:\\Asset\\"+oDlg.GetFileName());

#8


漏了一句。
fileParam->lpExistingFileName=oDlg.GetPathName();

#9


这一句应该也不行吧
原因与lpNewFileName一样

#10


引用 9 楼 bombzhang 的回复:
这一句应该也不行吧
原因与lpNewFileName一样
恩。是的。兄台,你说的我道理我懂了,代码还是不会。。。

#11


多多动手练习,每个人都是从不会开始的

#12


error C2664: 'strcpy' : cannot convert parameter 1 from 'LPCTSTR' to 'char *'

#13


FILEPARAM的定义贴出来看看

#14


struct FILEPARAM
{
CString lpExistingFileName;
char lpNewFileName[MAX_PATH];//这是根据你的改的
// CString lpNewFileName;//这是原来我定义的
};

#15


fileParam->lpNewFileName=strFileName;就报这个错了
error C2440: '=' : cannot convert from 'CString' to 'char [260]'

#16


struct FILEPARAM
{
CString lpExistingFileName;
CString lpNewFileName;//这是原来我定义的
};
你原来把lpNewFileName定义成CString类型,那你原来的赋值方法应该没问题啊,我看到有个lp还以为是个指针。

FILEPARAM* fileParam;//没初始化?比如FILEPARAM* fileParam=new FILEPARAM;
fileParam->lpNewFileName="d:\\Asset\\"+oDlg.GetFileName();

#17


引用 16 楼 bombzhang 的回复:
struct FILEPARAM
{
CString lpExistingFileName;
CString lpNewFileName;//这是原来我定义的
};
你原来把lpNewFileName定义成CString类型,那你原来的赋值方法应该没问题啊,我看到有个lp还以为是个指针。

FILEPARAM* fileParam;//没初始化?比如FILEPARAM* filePa……
谢谢兄台。确实是没初始化。。

#18


引用 16 楼 bombzhang 的回复:
struct FILEPARAM
{
CString lpExistingFileName;
CString lpNewFileName;//这是原来我定义的
};
你原来把lpNewFileName定义成CString类型,那你原来的赋值方法应该没问题啊,我看到有个lp还以为是个指针。

FILEPARAM* fileParam;//没初始化?比如FILEPARAM* filePa……
确实是没初始化,可是为什么用②的时候不用初始化呢

#19


fileParam刚刚定义的时候是个随机指针,所以fileParam->lpNewFileName也是个随机指针,只是这个指针指向的地址是不确定的。
 fileParam.lpNewFileName="d:\\Asset\\123.mpg";//把一个常量字符串指针赋给lpNewFileName,所以可以用,但是说不定什么时候lpNewFileName就被修改了。

fileParam.lpNewFileName="d:\\Asset\\"+oDlg.GetFileName();//赋值结果指向一个临时CString变量,这个变量一释放字符串内容就没了。

#20


恩。谢谢兄台。明白了 CopyFileEx函数传参问题

#21