程序是想启动默认的邮件编辑器然后把一些字符自动显示在"新邮件"窗口的编辑框里,现在只写了针对Outlook Express的代码.
可是问题出现了,直接运行程序的话用Spy++查看时什么也没有写进去;如果Debug的话能用Spy++看到字符串已经写到了控件里,可是什么也没有显示出来.#include <WINDOWS.H>#include <iostream>
#include <string>
using namespace std;LPCTSTR QueryReg ();
void FindReplace (string &str, const char *strFind, const char *strReplace);void main()
{
static PTSTR pString = "Gibson";

LPCTSTR fileLocation = QueryReg ();
string str = fileLocation;
FindReplace (str,"%ProgramFiles%","C:\\PROGRA~1");
WinExec (str.c_str(), SW_SHOW);

HWND hWindow = FindWindow("ATH_Note", "新邮件");
HWND hChildWindow = FindWindowEx(hWindow, NULL, "OE_Envelope", "");
HWND hControl = FindWindowEx(hChildWindow, NULL, "ComboBox", "");
hControl = GetNextDlgTabItem(hChildWindow,hControl,FALSE);
SetDlgItemText(hChildWindow, GetDlgCtrlID(hControl), pString);
}LPCTSTR QueryReg ()
{
LPCTSTR subKey = "mailto\\shell\\open\\command\\";
HKEY hKEY;
LPBYTE Data;
DWORD cbData = 80;
Data = new BYTE[80];
RegOpenKeyEx (HKEY_CLASSES_ROOT, subKey, 0, KEY_READ, &hKEY);
RegQueryValueEx (hKEY, NULL, NULL, NULL, Data,& cbData);
RegCloseKey (HKEY_CLASSES_ROOT);
char * value = (char*)Data;
return value;
}void FindReplace (string &str, const char *strFind, const char *strReplace)
{
int nIndex = 0;
while ( (nIndex = str.find (strFind, nIndex)) != -1 )
{
str.replace ( nIndex, strlen (strFind), strReplace );
nIndex += strlen (strFind);
}
}

解决方案 »

  1.   

    Data,value都是是个局部变量,你返回的指针为空.
      

  2.   

    直接运行的时候刷新快,看不到字符串了.Debug的时候可能内存还没有被其他东西占用所以能够看到,就这个原因吧,这是我的看法.
      

  3.   

    Data,value是我从另外一个函数里拷来后改时没注意忘去掉了,但并没太大影响,QueryReg()照样可以从注册表里取出地址,邮件编辑器能正常启动的
      

  4.   

    直接运行后用Spy++查看时是:********""RichEdit20W
    可是Debug时用Spy++查看时是:********"Gibson"RichEdit20W
      

  5.   

    直接运行的时候刷新快,看不到字符串了.Debug的时候可能内存还没有被其他东西占用所以能够看到,就这个原因吧,这是我的看法.
    __________________________________________________________________________________
    有道理,我在WinExec (str.c_str(), SW_SHOW)后面加了个Sleep()就可以了.
    可是往编辑框里写进去了数据了,为什么显示不出来呢?RichEdit20W不是""了,已经是"Gibson"了,可是什么也没有显示出来啊