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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值