C ++命令行参数的值大小限制

时间:2016-05-21 18:23:24

标签: c++ windows command-line clipboard

我有以下代码来获取Windows 7中剪贴板的命令行参数值。我使用Orwell Dev c ++编译并运行我的脚本。

//#include "stdafx.h"
#include "windows.h"
#include "string.h"
#include <direct.h>
#include <iostream>

int main(int argc, wchar_t* argv[])
{
    LPWSTR cwdBuffer;

    // Get the current working directory:
    if( (cwdBuffer = _wgetcwd( NULL, 0 )) == NULL )
        return 1;

    //DWORD len = wcslen(cwdBuffer);
    DWORD len = wcslen(argv[0]);
    HGLOBAL hdst;
    LPWSTR dst;

    // Allocate string for cwd
    hdst = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
    dst = (LPWSTR)GlobalLock(hdst);
    memcpy(dst, cwdBuffer, len * sizeof(WCHAR));
    dst[len] = 0;
    GlobalUnlock(hdst);

    // Set clipboard data
    if (!OpenClipboard(NULL)) return GetLastError();
    EmptyClipboard();
    if (!SetClipboardData(CF_UNICODETEXT, hdst)) return GetLastError();
    CloseClipboard();

    free(cwdBuffer);
    return 0;
}

所以我编译并运行了一次这个脚本,并在此过程中生成了它的可执行文件,因此我可以运行可执行文件(可能作为命令分配给任何编辑器,如geany,以使其当前打开文件路径到剪贴板)并传递参数(如果是Geany,则为%d)并将其值传递给剪贴板。

但是当我的命令行参数具有C:\wamp\www\magento1922\app\code\community\Cm\RedisSession\Model之类的值时,它只会将C:\wamp\www\magento1922\app\code\commu复制到剪贴板。

为什么?它与Windows命令行参数大小限制有关吗?

1 个答案:

答案 0 :(得分:-1)

感谢所有评论,他们指出了我正确的方向,并且我能够使脚本完全正常工作。

我删除了cwdBuffer的不必要引用,并将其替换为我的参数数组元素argv[0]。以下是代码。

#include "windows.h"
#include "string.h"
#include <direct.h>
#include <iostream>
#include <shellapi.h>
#include <stdio.h>

int main(int argc, wchar_t* argv[])
{
    //LPWSTR cwdBuffer;

    // Get the current working directory:
    if( (argv[0] = _wgetcwd( NULL, 0 )) == NULL )
        return 1;

    DWORD len = wcslen(argv[0]);
    HGLOBAL hdst;
    LPWSTR dst;

    // Allocate string for cwd
    hdst = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
    dst = (LPWSTR)GlobalLock(hdst);
    memcpy(dst, argv[0], len * sizeof(WCHAR));
    dst[len] = 0;
    GlobalUnlock(hdst);

    // Set clipboard data
    if (!OpenClipboard(NULL)) return GetLastError();
    EmptyClipboard();
    if (!SetClipboardData(CF_UNICODETEXT, hdst)) return GetLastError();
    CloseClipboard();

    free(argv[0]);
    return 0;
}