精华内容
下载资源
问答
  • main 及 WinMain参数

    2012-12-28 10:13:29
    【转】main 及 WinMain参数 最近在写win32的界面程序比较多(以前多写命令行和dll), 所以多了解了下WinMain, 并与main作下比较. 作为一个笔记吧. C/C++语言中的main函数, 经常带有参数argc, argv, 如下: ...

    【转】main 及 WinMain参数

    最近在写win32的界面程序比较多(以前多写命令行和dll), 所以多了解了下WinMain, 并与main作下比较. 作为一个笔记吧.

    C/C++语言中的main函数, 经常带有参数argc, argv, 如下:
    int main(int argc, char** argv)
    int main(int argc, char* argv[])        //也可以是wchar_t 或 tchar
    argc 是指命令行输入参数的个数, argv存储了所有的命令行参数. 在命令行下, 每两个argv[n]之间以空格分隔.
    如在命令行下输入 test.exe a b
    argc 为 3
    argv[0] 为 "test.exe"
    argv[1] 为 "a"
    argv[2] 为 "b"

    以下一个简单的程序可以帮你看看argc, argv具体代表什么.

    #include <stdio.h>

    int main(int argc, char* argv[])
    {
        for (int i = 0; i < argc; i++)
        {
            printf("%s\n", argv[i]);
        }
        return 0;
    }

    另外, vc环境下向程序传递参数可以在 Debugging -> command argument 下设置. (下面说的WinMain也一样)


    WinMain函数的原型声明如下:

    int WINAPI WinMain(
                    HINSTANCE hInstance, // handle to current instance
                    HINSTANCE hPrevInstance, // handle to previous instance
                    LPSTR lpCmdLine, // command line
                    int nCmdShow // show state
    );

    WinMain函数接收4个参数, 这些参数都是在系统调用WinMain函数时, 传递给应用程序的.

    第一个参数hInstance表示该程序当前运行的实例的句柄, 这是一个数值. 当程序在Windows下运行时, 它唯一标识运行中的实例(注意, 只有运行中的程序实例, 才有实例句柄). 一个应用程序可以运行多个实例, 每运行一个实例, 系统都会给该实例分配一个句柄值, 并通过hInstance参数传递给WinMain函数.

    第二个参数hPrevInstance (MSDN)在Win32环境下, 这个参数不起作用.

    第三个参数lpCmdLine是一个以空('\0')终止的字符串, 指定传递给应用程序的命令行参数.
    注: 这个跟命令行的int main(int argc, char* argv[])不同
    仍以上文
    test.exe a b
    为例, lpCmdLine 为 "a b"

    第四个参数nCmdShow指定程序的窗口应该如何显示, 例如最大化、最小化、隐藏等. 这个参数的值由该程序的调用者所指定, 应用程序通常不需要去理会这个参数的值.

    关于WinMain函数前的修饰符WINAPI, 请参看下面关于__stdcall的介绍. 读者可以利用goto definition功能查看WINAPI的定义, 可以看到WINAPI其实就是__stdcall

    展开全文
  • WinMain参数求助

    2021-02-04 22:40:48
    刚刚学WinMain,求hInstance即“当前实例句柄”到底是什么意思
  • WinMain参数传入问题

    千次阅读 2008-11-11 10:28:00
    另:VC编程中给人的感觉WinMain是应用程序的入口点,但从汇编编程角度来说,WinMain是在执行一些初始化步骤后才调用的一个子过程,传入的参数是在初始化是获取的,同时 "WinMain "也可改成任意的名称。不知你是否指...
    CreateProcess时可传入。 
    

    另:VC编程中给人的感觉WinMain是应用程序的入口点,但从汇编编程角度来说,WinMain是在执行一些初始化步骤后才调用的一个子过程,传入的参数是在初始化是获取的,同时 "WinMain "也可改成任意的名称。不知你是否指的是这种情况。

    .code
    start:
    invoke   GetModuleHandle,   NULL
    mov   g_hInst,   eax
    invoke   GetCommandLine,   NULL
    mov   g_CmdLine,   eax
    ...
    invoke   WinMain,   g_hInst,   NULL,   g_CmdLine,   SW_SHOWDEFAULT
    invoke   ExitProcess,   eax


    WinMain   proc   hInstance:DWORD,   hInstPrev:DWORD,   lpCmdLine:DWORD,   nCmdShow:DWORD  
        ...
        xor   eax,   eax
        ret
    WinMain   endp
    end   start
    展开全文
  • win32中winmain参数lpCmdLine是地址名是无法正常运行首先描述准备显示的功能:使用win32 app创建一个程序,可以实现文件关联方面的操作,即选择一副图片,可以使用右键选择此次得到的exe(类似于文件文件关联)。...

    win32winmain参数lpCmdLine是地址名是无法正常运行

     

    首先描述准备显示的功能:使用win32 app创建一个程序,可以实现文件关联方面的操作,即选择一副图片,可以使用右键选择此次得到的exe(类似于文件文件关联)

     

     

     

     

    但是程序没有正常运行,于是使用messagebox调出lpcmdline,弹出如下对话框:


    于是,认为lpcmdline中存在单斜杠(/),但是被被函数调用 ,这个单斜杠成为了转义字符。

    实际上,这种想法是错误的,因为lpcmdline的类型Lpstr就是char *,因此如果char数组那个存在单斜杠,那么字符中一定是’//’

    其实真正的问题,在于那个引号!!!笔者在winmain里面,手动对lpcmdline赋值,发现messagebox输出的char中,是没有双引号存在的,因此lpcmdline的地址不可用,问题应该与这个双引号相关。

    于是,笔者增加了如下代码:

    if(strcmp(lpCmdLine,""))

          {

               char * name = new char [strlen(lpCmdLine)-2];

               int i=0;

               i=1;

               if(lpCmdLine[0] == 34)//34 双引号ascii

               {

                     while(lpCmdLine[i] !=34)

                     {

                          name[i-1] = lpCmdLine[i];

                          ++i;

                     }

                     name[i-1]= '/0';

               }

     

               pImage = cvLoadImage(name);//这个opencv的一个函数,调用参数是const char *

               if(pImage )

               {

                     MessageBox(NULL,"哇哈","text",MB_OK);

                     MessageBox(NULL,(LPCTSTR)(lpCmdLine),"text",MB_OK);

               }

               delete []name;

        }

    果不其然,问题得到解决。

    其实,这次调试花得时间有点长,主要是以为对字符串的理解不够深,另外一个观察问题的能力。希望以后会有所改进。

     

    展开全文
  • 序先写好了linux版的工程, 还要写一个同样功能的win版工程. 为了win版复用已有的linux版实现, 准备在win版中调用linux版的main.... 这就存在一个将win版的winMain参数传给main的问题. 这几天, 遇到好

    先写好了linux版的工程, 还要写一个同样功能的win版工程.
    为了win版复用已有的linux版实现, 准备在win版中调用linux版的main. 这样, 大部分代码就都能服用了, win版写的就是个loader. 在linux实现中, 用WIN宏,将win实现和linux实现不同的地方隔开.
    这就存在一个将win版的winMain参数传给main的问题.
    这几天, 遇到好几次了, 总结一下.

    实验

    // @file my_linux_prog_win_version.cpp
    
    #include "stdafx.h"
    #include <atlbase.h>
    #include <atlconv.h>
    #include <shellapi.h>
    #include "my_linux_prog_win_version.h"
    
    // win工程中包的linux实现的main函数, 用宏改名为xx_MAIN
    //  #ifndef WIN32
    //  int main(int argc, char** argv) {
    //  #else
    //  int MY_LINUX_PROG_MAIN(int argc, char** argv) {
    //  #endif #ifndef WIN32
    //      // linux prog imp ...
    //      return 0;
    //  }
    int MY_LINUX_PROG_MAIN(int argc, char* argv[]);
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
        USES_CONVERSION;
        int i = 0;
        LPWSTR* psz_argvW = NULL;
        LPWSTR* psz_curW = NULL;
        std::string str_tmp = "";
        int i_argc = 0;
        char** pargv = NULL;
    
        UNREFERENCED_PARAMETER(hPrevInstance);
    
        // lpCmdLine only parameter, lpCmdLine[0] is not this.exe
        psz_argvW = CommandLineToArgvW(lpCmdLine, &i_argc);
        if (NULL != psz_argvW) {
            pargv = new char*[i_argc + 1];
            if (NULL != pargv) {
                pargv[0] = new char[MAX_PATH];
                if (NULL != pargv[0]) {
                    memset(pargv[0], 0, MAX_PATH);
                    GetModuleFileNameA(NULL, pargv[0], MAX_PATH);
                }
    
                for (i = 0; i < i_argc; i++) {
                    pargv[i + 1] = new char[MAXBYTE];
                    if (NULL != pargv[i + 1]) {
                        memset(pargv[i + 1], 0, MAXBYTE);
                        str_tmp = W2A(psz_argvW[i]);
                        strncpy(pargv[i + 1], str_tmp.c_str(), min(MAXBYTE -1, strlen(str_tmp.c_str())));
                    }
                }
    
                MY_LINUX_PROG_MAIN(i_argc + 1, pargv);
    
                for (i = 0; i < (i_argc + 1); i++) {
                    if (NULL != pargv[i]) {
                        delete[] pargv[i];
                        pargv[i] = NULL;
                    }
                }
    
                delete[] pargv;
                pargv = NULL;
            }
    
            LocalFree(psz_argvW);
            psz_argvW = NULL;
        }
    
        return 0;
    }
    
    
    展开全文
  • WinMain函数参数

    2011-06-28 15:07:00
    http://blogold.chinaunix.net/u/27166/showart_400373.html WinMain函数的定义WinMain函数的原型声明如下:int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPre
  • WinMain函数参数介绍

    2017-04-04 21:04:25
    WinMain函数的定义 WinMain函数的原型声明如下: int WINAPI WinMain(  HINSTANCE hInstance, // handle to current instance  HINSTANCE hPrevInstance, // handle to previous instance  LPSTR lpCmdLi
  • winmain输入命令参数

    2020-12-22 22:20:39
    1. 在VS2010的环境中,添加winmain的命令参数
  • WinMain函数的定义 WinMain函数的原型声明如下: int WINAPI WinMain(  HINSTANCE hInstance, // handle to current instance  HINSTANCE hPrevInstance, // handle to previous instance  LPSTR ...
  • WinMain函数与main函数不同,main可以从argc得到函数个数,然后从argv[]数组里取参数。 而WinMain函数取参数是通过lpCmdLine,lpCmdLine里不能得到参数的个数。 下面使用strtok来将参数分开。 int WINAPI WinMai
  • win32入口函数WinMain函数参数介绍

    千次阅读 2019-07-09 09:15:02
    WinMain函数的定义 WinMain函数的原型声明如下: int WINAPI WinMain( HINSTANCEhInstance, // handle to current instance HINSTANCEhPrevInstance, // handle to previous instance LPSTRlpCmdLine,...
  • main与WinMain命令行参数提取

    千次阅读 2010-07-07 23:36:00
     int main(int argc, char *argv[])  argc是外部命令参数的个数,argv[]存放各参数的内容。argc >= 1,argv[0]存放程序文件本身。  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE ...
  • WinMain中的lpCmdLine参数

    2014-10-20 22:11:59
    win32可执行程序分为两种类型,基于控制台(Consol-based)的和基于窗口...这两个入口函数一大区别是对于命令行参数的处理。 WinMain函数原型:int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR l
  • WINMAIN函数的参数是怎样传递的
  • WinMain

    2017-05-11 17:23:59
    //三四个参数为消息过滤器min-max { TranslateMessage(&msg); DispatchMessage(&msg); } return 0 ; } LRESULT CALLBACK WinSunProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { ...
  • WINMAIN

    2019-05-10 00:02:55
    __stdcall 就是让编译器知道应该以兼容windows的方式来产生机器指令,如果你在别的平台开发,当然也不会去写winmain WINAPI 转换成CALLBACK也是可行的,因为#define CALLBACK __stdcall,但人家之所以给同一个东西...
  • WinMain函数的4个参数

    2015-06-30 16:06:15
    WinMain函数的定义 WinMain 函数的原型声明如下: int WINAPI WinMain( HINSTANCE hInstance , // handle to current instance HINSTANCE hPrevInstance , // handle to previous instance ...
  • //http://www.flipcode.com/archives/WinMain_Command_Line_Parser.shtml // COTD Entry submitted by Max McGuire [amcguire@andrew.cmu.edu] ...int WINAPI WinMain(HINSTANCE instance, HINSTANCE pr
  • 当一个GUI应用程序开始运行时,控制流会从WinMain函数开始。它的第二个参数,hPrevInstance,在Win32应用程序中永远为0。这个参数有什么特殊之处吗? 当然有。 在早期的16位Windows时代,曾经有一个名叫...
  • 写程序贴图,其中有一句 hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1));...但不小心把WinMain的两个参数hInstance与hPrevInstance写错位了. 结果Bitmap加载到了父程序句柄里了 BitBlt贴图贴不出来.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,602
精华内容 7,840
关键字:

winmain参数