序
先写好了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;
}