CreateProcessWithLogonW函数只能在console程序中调用吗?

foxknight 2005-12-14 09:35:49
下面的代码可以运行。但是在一个其他的工程中(比如基于Dialog的)调用CreateProcessWithLogonW时,提示说没有定义,弄了半天,没有解决。请指教:)

#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>

int wmain(int argc, WCHAR *argv[])
{
if (argc != 4) {
wprintf(L"Usage: %s user pwd cmd\n", argv[0]);
return -1;
}

STARTUPINFOW si;
ZeroMemory(&si,sizeof(si));
si.cb= sizeof(si);
PROCESS_INFORMATION piProcess;

if (!CreateProcessWithLogonW(argv[1], L"", argv[2], 0, argv[3], NULL, 0,
NULL, NULL, &si, &piProcess)) {
wprintf(L"err [%u]\n", GetLastError());
}

return 0;
}
...全文
164 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Atomictry 2005-12-14
  • 打赏
  • 举报
回复
第一种静态库的方法:
bobob(PDFViewer2.0 Release拉!) 的方法就是
但是宣称CreateProcessWithLogonW应该有问题,估计要加extern宏

另一种动态库的方法:
typedef BOOL(_cdecl *PCreateProcessWithLogonW)(
LPCWSTR lpUsername, // user's name
LPCWSTR lpDomain, // user's domain
LPCWSTR lpPassword, // user's password
DWORD dwLogonFlags, // logon option
LPCWSTR lpApplicationName, // executable module name
LPWSTR lpCommandLine, // command-line string
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCWSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFOW lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInfo // process information
);

BOOL load()
{
HINSTANCE hinstDLL;
hinstDLL = LoadLibrary("advapi32.dll");
if (NULL == hinstDLL)
{
TRACE("LoadLibrary error.\n");
return FALSE;
}
PCreateProcessWithLogonW CreateProcessWithLogonW;
CreateProcessWithLogonW = (PCreateProcessWithLogonW)GetProcAddress(hinstDLL, "CreateProcessWithLogonW");
CreateProcessWithLogonW ("your param here!");
FreeLibrary(hinstDLL);
return TRUE;
}

DrSmart 2005-12-14
  • 打赏
  • 举报
回复
你会发现这个是宽字节的unicode函数,有个W,普通的是ANSI的函数,需要转换
foxknight 2005-12-14
  • 打赏
  • 举报
回复
谢谢楼上2位
但我想知道为什么这样会不行呢,还有好的解决办法吗?
bobob 2005-12-14
  • 打赏
  • 举报
回复
要么就不用头文件,直接声明
BOOL CreateProcessWithLogonW(
LPCWSTR lpUsername, // user's name
LPCWSTR lpDomain, // user's domain
LPCWSTR lpPassword, // user's password
DWORD dwLogonFlags, // logon option
LPCWSTR lpApplicationName, // executable module name
LPWSTR lpCommandLine, // command-line string
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCWSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFOW lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInfo // process information
);

STARTUPINFOW si;
ZeroMemory(&si,sizeof(si));
si.cb= sizeof(si);
PROCESS_INFORMATION piProcess;

if (!CreateProcessWithLogonW(argv[1], L"", argv[2], 0, argv[3], NULL, 0,
NULL, NULL, &si, &piProcess)) {
wprintf(L"err [%u]\n", GetLastError());
}
Featured 2005-12-14
  • 打赏
  • 举报
回复
所以肯定能用的
Featured 2005-12-14
  • 打赏
  • 举报
回复
不是的
MSDN指出:
Requirements
Windows NT/2000 or later: Requires Windows 2000 or later.
Windows 95/98/Me: Unsupported.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Advapi32.lib.
Unicode: Implemented only as Unicode.
foxknight 2005-12-14
  • 打赏
  • 举报
回复
to:Atomictry(天影 -- 哈哈哈哈,日子没法过了)
不是了,这个函数在头文件中,你再看看我提的问题:

下面的代码可以运行。但是在一个其他的工程中(非Console的,比如基于Dialog的)调用CreateProcessWithLogonW时,提示说没有定义,弄了半天,没有解决。请指教:)

#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>

int wmain(int argc, WCHAR *argv[])
{
if (argc != 4) {
wprintf(L"Usage: %s user pwd cmd\n", argv[0]);
return -1;
}

STARTUPINFOW si;
ZeroMemory(&si,sizeof(si));
si.cb= sizeof(si);
PROCESS_INFORMATION piProcess;

if (!CreateProcessWithLogonW(argv[1], L"", argv[2], 0, argv[3], NULL, 0,
NULL, NULL, &si, &piProcess)) {
wprintf(L"err [%u]\n", GetLastError());
}

return 0;
}
Atomictry 2005-12-14
  • 打赏
  • 举报
回复
没有了,对于这种函数没有在头文件中,却在lib,dll中存在的情况,就两种: dll隐式链接和dll显示链接!
foxknight 2005-12-14
  • 打赏
  • 举报
回复
不好意思,用下面这个可以了,但是感觉很别扭。有更好的方法吗?
extern "C" {
BOOL WINAPI CreateProcessWithLogonW(
LPCWSTR lpUsername, // user's name
LPCWSTR lpDomain, // user's domain
LPCWSTR lpPassword, // user's password
DWORD dwLogonFlags, // logon option
LPCWSTR lpApplicationName, // executable module name
LPWSTR lpCommandLine, // command-line string
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCWSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFOW lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInfo // process information
);
}
foxknight 2005-12-14
  • 打赏
  • 举报
回复
用下面这个也是不行。。。
extern "C" {
BOOL CreateProcessWithLogonW(
LPCWSTR lpUsername, // user's name
LPCWSTR lpDomain, // user's domain
LPCWSTR lpPassword, // user's password
DWORD dwLogonFlags, // logon option
LPCWSTR lpApplicationName, // executable module name
LPWSTR lpCommandLine, // command-line string
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCWSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFOW lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInfo // process information
);
}
foxknight 2005-12-14
  • 打赏
  • 举报
回复
谢谢大家,用LoadLibrary,GetProcAddress可以。

但是用下面这个方法编译不过去,我已经在工程里添加Advapi32.lib文件了,错误信息是:
error LNK2001: unresolved external symbol "int __stdcall CreateProcessWithLogonW(unsigned short const *,unsigned short const *,unsigned short const *,unsigned long,unsigned short const *,unsigned short *,unsigned long,void *,unsig
ned short const *,struct _STARTUPINFOW *,struct _PROCESS_INFORMATION *)" (?CreateProcessWithLogonW@@YGHPBG00K0PAGKPAX0PAU_STARTUPINFOW@@PAU_PROCESS_INFORMATION@@@Z)
Release/RunAsUser.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

如何解决呢?

BOOL CreateProcessWithLogonW(
LPCWSTR lpUsername, // user's name
LPCWSTR lpDomain, // user's domain
LPCWSTR lpPassword, // user's password
DWORD dwLogonFlags, // logon option
LPCWSTR lpApplicationName, // executable module name
LPWSTR lpCommandLine, // command-line string
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCWSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFOW lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInfo // process information
);

STARTUPINFOW si;
ZeroMemory(&si,sizeof(si));
si.cb= sizeof(si);
PROCESS_INFORMATION piProcess;

if (!CreateProcessWithLogonW(argv[1], L"", argv[2], 0, argv[3], NULL, 0,
NULL, NULL, &si, &piProcess)) {
wprintf(L"err [%u]\n", GetLastError());
}
lifengice0706 2005-12-14
  • 打赏
  • 举报
回复
上面已有正解,实在不行,就LoadLibrary,GetProcAddress。

16,551

社区成员

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

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

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