下面的代码可以运行。但是在一个其他的工程中(比如基于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;
}

解决方案 »

  1.   

    不是的
    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.
      

  2.   

    要么就不用头文件,直接声明
    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());
        }
      

  3.   

    你会发现这个是宽字节的unicode函数,有个W,普通的是ANSI的函数,需要转换
      

  4.   

    第一种静态库的方法:
        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;
    }
       
      

  5.   

    上面已有正解,实在不行,就LoadLibrary,GetProcAddress。
      

  6.   

    谢谢大家,用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());
        }
      

  7.   

    用下面这个也是不行
    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
            );
    }
      

  8.   

    不好意思,用下面这个可以了,但是感觉很别扭。有更好的方法吗?
    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
            );
    }
      

  9.   

    没有了,对于这种函数没有在头文件中,却在lib,dll中存在的情况,就两种: dll隐式链接和dll显示链接!
      

  10.   

    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;
    }