已关联了特定的文件类型,但双击后只启动程序却不打开文件

seliber 2007-08-21 11:16:04
在程序中,已经将特有的文件格式与程序关联了.
双击文件时,会启动此程序,但却不能打开文件.

我试图得到文件的路径和名称
在App的InitInstance中用下面的方法


CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
m_sFileName = cmdInfo.m_strFileName; //文件路径

但是m_sFileName却一直是空的.
请教各位大人..
...全文
367 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2007-08-22
  • 打赏
  • 举报
回复
你怎么关联的?代码。
knightshenbin 2007-08-22
  • 打赏
  • 举报
回复
有了这几句就可以响应双击打开了阿,
你的打开文件的消息响应函数在APP里面么?是否是用串行化来打开文件的?没有改写OnOPenDocument等消息的机制吧?如果这些都没问题的话应该是可以双击打开的
seliber 2007-08-22
  • 打赏
  • 举报
回复
问题已经找出来了..
感谢各位朋友.

我在关联文件时,打开程序的路径没有加上%l.所以总是m_lpCmdLine总是空值.

现在可以了,看来还需要多了解一些注册表的知识.
seliber 2007-08-22
  • 打赏
  • 举报
回复
to knightshenbin(勤练内功)
文件不是用串行化打开的..
OnOpenDocument改过,打开文件的消息响应不是在APP里面..放在了Mainframe类里面的.

to Mackz
我添加了一个注册的函数Associate(),并在APP的InitInstance()中call这个函数
void CXXXApp::Associate()
{
HKEY hk;
ULONG disposition;
char szName[256];
//写入键值.xxx,..........
strcpy(szName,".xxx\\");
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,szName,0,NULL,REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, &hk, &disposition)!=ERROR_SUCCESS)
{
return;
}
if(RegSetValue(hk,NULL,REG_SZ,"xxxfile",9)!=ERROR_SUCCESS)
{
return;
}
//写入子键xxxfile的默认打开路径
strcpy(szName,"xxxfile\\shell\\open\\command");
if(RegCreateKeyEx(HKEY_CLASSES_ROOT,szName,0,NULL,REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, &hk, &disposition)!=ERROR_SUCCESS)
{
return;
}
char szBuf[MAX_PATH];
GetModuleFileName(AfxGetInstanceHandle(),szBuf,sizeof(szBuf));
if(RegSetValue(hk,NULL,REG_SZ,szBuf,9) != ERROR_SUCCESS)
{
return;
}

}

seliber 2007-08-21
  • 打赏
  • 举报
回复
1982pc() ( ) 信誉:100 2007-08-21 11:28:01 得分: 0



LPTSTR m_lpCmdLine;
这个值应该在什么地址初始化呢?


先去吃饭
seliber 2007-08-21
  • 打赏
  • 举报
回复
添加了注册表的信息
用RegCreateKeyEx和RegSetValue两个函数添加我需要的注册表信息..
菜牛 2007-08-21
  • 打赏
  • 举报
回复
你怎么关联的?
1982pc 2007-08-21
  • 打赏
  • 举报
回复
用这个看看吧
Corresponds to the lpCmdLine parameter passed by Windows to WinMain.
LPTSTR m_lpCmdLine;
Remarks
Points to a null-terminated string that specifies the command line for the application. Use m_lpCmdLine to access any command-line arguments the user entered when the application was started. m_lpCmdLine is a public variable of type LPTSTR.
Example
BOOL CMyApp::InitInstance()
{
// ...

if (m_lpCmdLine[0] == _T('\0'))
{
// Create a new (empty) document.
OnFileNew();
}
else
{
// Open a file passed as the first command line parameter.
OpenDocumentFile(m_lpCmdLine);
}

// ...
}
seliber 2007-08-21
  • 打赏
  • 举报
回复
1982pc()
我用了你上面提到的办法.
但是在双击外部文件时,m_lpCmdLine[0]的值是空的,判断以后,又切到新建文档里.
而我需要的是打开此文档.不知道是否其中还有什么不对的地方?

seliber 2007-08-21
  • 打赏
  • 举报
回复
1982pc() ( ) 信誉:100
呃..这个参数都没有声明,也可以用的啊?我试试
seliber 2007-08-21
  • 打赏
  • 举报
回复
knightshenbin(勤练内功)

我看了你给的那一段代码..
m_pMainWnd->DragAcceptFiles();//这句是控制拖拽文件进程序的
后面的那两句我程序里有的.

是不是主要起作用的就是
cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
ProcessShellCommand(cmdInfo);

我刚新那建了一个工程试了一下.发现会弹出提示:
一未命名文件中包含无效路径
1982pc 2007-08-21
  • 打赏
  • 举报
回复
晕~~~~直接用就好了,查MSDN很清楚的
seliber 2007-08-21
  • 打赏
  • 举报
回复
我看到第一句说要响应这个参数.我的程序是用MFC做的.
没有找到WinMain的参数啊.

knightshenbin 2007-08-21
  • 打赏
  • 举报
回复
那你什么也不用做就能支持了阿。
去掉这句 m_sFileName = cmdInfo.m_strFileName; //文件路径

//Enable drag/drop open
m_pMainWnd->DragAcceptFiles();
//Enable DDE Execute open
EnableShellOpen();
RegisterShellFileTypes(TRUE);

// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
cmdInfo.m_nShellCommand=CCommandLineInfo::FileOpen;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
ProcessShellCommand(cmdInfo);
1982pc 2007-08-21
  • 打赏
  • 举报
回复
这个是微软的WinMain参数,不用初始化
seliber 2007-08-21
  • 打赏
  • 举报
回复
是的..

knightshenbin 2007-08-21
  • 打赏
  • 举报
回复
你的打开文件是不是在APP里面用他的默认消息传输机制作的?
seliber 2007-08-21
  • 打赏
  • 举报
回复
顶顶,继续问

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧