一个很菜的问题:确定Excel的路径
有没有一个比较通用快速的方法确定Excel.EXE在什么地方? 问题点数:90、回复次数:12Top
1 楼Feicker()回复于 2000-12-11 19:01:00 得分 0
如果你想要运行 Excel的文件的话,直接用ShellExecute(handle, "open", “???.exl", NULL, NULL, SW_SHOWNORMAL);即可
Top
2 楼sxbyl(sxbyl)回复于 2000-12-12 09:09:00 得分 0
问题是ShellExecute要等到关闭Excel才进行下一步操作,而我的操作需要在Excel运行时进行操作,我用的是CreateProcess,但PATH里还没有Excel,所以必须指定完整的路径名。
另外:我是在不支持MFC的ATL中调用Excel的,要完成的功能很简单,就是从粘贴板拷些东西进去,有什么比较好的方法?我现在的方法是模拟键盘操作:先是右Ctrl键左面的那个键,然后是P键,虽可工作,但要弹出菜单,太难看。本来想输入Ctrl+V,但那个Ctrl键死活输不进去,只能完成一个V键。用Spy++跟踪了半天也没发现WM_COMMAND 如果水有更好的方法解决此问题,分数自然大大的!Top
3 楼AtCsdn()回复于 2000-12-12 11:41:00 得分 40
用注册表。
path 存放在注册表的HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\App Paths\Excel.exe键下,取出该键下相应的值即可。
如果关于注册表的编程还不太清楚,可Email me: bsliu78@263.netTop
4 楼sxbyl(sxbyl)回复于 2000-12-12 11:52:00 得分 0
多谢AtCsdn!!!现路径问题已解决!不知第二个问题有什么好的方法?Top
5 楼vcmfc(【痛苦的虫虫】)回复于 2000-12-12 11:58:00 得分 0
为啥不用COM来操作Excel,是不是觉得麻烦?Top
6 楼vcmfc(【痛苦的虫虫】)回复于 2000-12-12 12:01:00 得分 0
小弟这两天在学习COM,可以的话我可以帮你做这个功能,我也可以正好练一练:vcmfc@sina.comTop
7 楼vcmfc(【痛苦的虫虫】)回复于 2000-12-12 12:02:00 得分 20
这可是我一个个打进去的,来自《软件报》.
如何通过一个程序给另外一个程序发送快捷键命令?(临时方法)
答:WM_KEYDOWN消息一次只能发送一个击键消息,不适合发送组合键。如果需要给另外一个运行的程序模拟快捷键,可以直接向其发命令消息WM_COMMAND,方法如下:(假设对方程序为B,我们需要编制的程序为A)
1.运行B程序,再启动VC所带的工具软件SPY++。选择SPY++的菜单命令 SPY->Message,调出“Message Options"对话框。
2.在WINDOW选项页中利用其窗口查找工具查到B程序的窗口句柄,因为B程序很有可能有多个窗口,子窗口(如MFC文档/视窗/框架类应用程序),因此要在"Additional Windows"中打开"Windows of Same Process"开关。
3.接下来设置"Message"选项页,在Messages to View中只选择WM_COMMAND消息,其它的消息全部清除。这样做的因为,当程序中检测到快捷键组合键时,会发送WM_COMMAND消息。
4."Output"选项页不用更多的设置,直接接收其缺省值即可。设置完后按"OK"按钮,这时SPY++开始监测B程序中的所有WM_COMMAND消息。
5.激活B程序,并在其中按下Ctrl+N组合键为有效的快捷键,便会触发WM_COMMAND消息,这时在SPY++的监视窗口中会看到至少一条WM_COMMAND消息,找到其中含有Send From an accelerator字样的WM_COMMAND消息,双击该消息,会弹出消息属性对话框,其中会显示消息的窗口句柄wParam、lParam等参数。记录下wParam、lParam,作为模拟快捷键消息的参数。单击其中的窗口句柄参数,还会显示该窗口属性的对话框,记下其中标题、类名称等窗口属性,以便于在A程序中查找和获得该窗口的句柄。
6.在A程序中添加向B发送模拟快捷键的代码,其步骤大致为:利用标题、类名称等,通过FindWindow函数获取B中响应快捷键的窗口。调用SendMesage函数向该窗口发送WM_COMMAND消息,wParam、lParam参数为第5步中记录的值。Top
8 楼sxbyl(sxbyl)回复于 2000-12-12 12:17:00 得分 0
用COM很简单,今天上午我就完成了一个用COM实现的版本,而且效果比昨天用的方法好,可老大说最好不要用COM,所以我只得继续以前的方法了。
至于Excel的跟踪我是打开所有消息进行观察的,就是没有那个WM_COMMAND,你可以试一下,而且Excel的菜单好像不是正规的菜单,好象是M$自己搞的一个东西。我用VC以资源的方式打开Excel,也没有菜单资源:(Top
9 楼sxbyl(sxbyl)回复于 2000-12-12 12:24:00 得分 0
对了,还有,我连Excel的工作区窗口都跟踪过了,无所获,先发送Ctrl键,在发送V键的方法也试过,都不行。发送WM_COMMAND的方法昨天我就在IE中实现了Top
10 楼bgsn(不告诉你)回复于 2000-12-12 12:58:00 得分 15
<pre>
1. FindExecutable()
2.最好使用Excel Automation,代码如下:
#include "stdafx.h"
// Assumes Office 97 has been installed in "G:\Program Files"
#define IMPATTRS rename("DocumentProperties", "DocProps")
#import <G:\Program Files\Microsoft Office\Office\mso97.dll> IMPATTRS
#import <G:\Program Files\Microsoft Office\Office\excel8.olb> IMPATTRS rename("DialogBox", "DialogBoxXL") rename("RGB", "RBG_XL")
#include <stdio.h>
#include <docobj.h>
#pragma hdrstop()
class OleInit {
public:
OleInit() { OleInitialize(NULL); }
~OleInit() { OleUninitialize(); }
} OleInitGlobal;
void dump_com_error(_com_error &);
void main()
{
try
{
using namespace Excel;
_ApplicationPtr pXL("Excel.Application");
pXL->Visible = true;
WorkbooksPtr pBooks = pXL->Workbooks;
_WorkbookPtr pBook = pBooks->Add((long)xlWorksheet);
_WorksheetPtr pSheet = pXL->ActiveSheet;
pSheet->Paste();
//See what happened
Sleep(5000);
pBook->Saved = true;
pXL->Quit();
}
catch(_com_error &e)
{
dump_com_error(e);
}
}
void dump_com_error(_com_error &e)
{
printf("Oops - hit an error!\n");
printf("\tCode = %08lx\n", e.Error());
printf("\tWCode = %04x\n", e.WCode());
printf("\tCode meaning = %s\n", e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\tSource = %S\n", (wchar_t*)bstrSource);
printf("\tDescription = %S\n", (wchar_t*)bstrDescription);
}
</pre>Top
11 楼sxbyl(sxbyl)回复于 2000-12-12 13:11:00 得分 0
To:bgsn 不好意思,你是不是没看我最后的的两条回复啊?现在的要求是不使用COM和MFCTop
12 楼ssawgift(恩承四季)回复于 2000-12-12 13:17:00 得分 15
HKEY_CLASSES_ROOT\CLSID\{00020812-0000-0000-C000-000000000046}\LocalServer32Top




