我通过那个函数做到像net view一样的效果列举已经知道主机的共享资源(已知其IP)
正好以前写过一个类似你这样的程序,调用net send。呵呵。
给你看看关键代码:
DWORD WINAPI CWinNetSendDlg::WorkProc(LPVOID lpParameter)
{
PThreadPara tempThreadParam = (PThreadPara) lpParameter;
STARTUPINFO si;
PROCESS_INFORMATION pi;
//重要!这里设置安全属性表示可继承非常重要!
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
CString strFileName, tempString;
// 目的:生成c:\logn.log n=1,2,3...
tempString.Format("%d",tempThreadParam->nTotal);
strFileName = "C:\\log";
strFileName += tempString;
// srand( (unsigned)time( NULL ) );
// int iRand = rand();
// tempString.Format("%d",iRand);
// strFileName += tempString;
strFileName += ".log";
// 创建文件并获得文件句柄
HANDLE hFile = CreateFile(strFileName,
GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
&sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE , NULL);
if (hFile == INVALID_HANDLE_VALUE)
AfxMessageBox(_T("请稍等再发!"));
else
{
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
// 设置标志位
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
// 使程序运行时不显示窗体
si.wShowWindow = SW_HIDE;
// 初始化重定向句柄
si.hStdOutput = hFile;
si.hStdError = hFile;
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
// 注意里面的参数第5个为True才能使得进程可以继承句柄
CreateProcess( NULL, // No module name (use command line).
//(char*)(LPCTSTR)strSend, // Command line.
(char*)(LPCTSTR)tempThreadParam->strSendContent,
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
TRUE, // Set handle inheritance to FALSE.
CREATE_NEW_PROCESS_GROUP, // No creation flags.
NULL, // Use parents environment block.
NULL, // Use parents starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ); // Pointer to PROCESS_INFORMATION structure.
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
//
//
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
// 移动到文件最前
::SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
// 得到文件大小
DWORD size = ::GetFileSize(hFile, NULL);
char* pbuf = new char[size + 1];
DWORD read = 0;
// 读文件
::ReadFile(hFile, pbuf, size, &read, NULL);
pbuf[read] = 0;
::CloseHandle(hFile);
CString strResult;
strResult = (CString) pbuf;
int nResult = strResult.Find(_T("消息已经送到"));
if(nResult == -1)
{
// 添加不能成功发送
::SendMessage(tempThreadParam->hMainWnd, WM_THREAD_NOTIFY, tempThreadParam->nIndex, 0);
}
else
{
// 添加成功发送
::SendMessage(tempThreadParam->hMainWnd, WM_THREAD_NOTIFY, tempThreadParam->nIndex, 1);
}
// AfxMessageBox(pbuf);
delete []pbuf;
delete tempThreadParam;
// Close process and thread handles.
}
return 0;
}