【问题标题】:C++ command line argument's value size limitC++ 命令行参数值大小限制
【发布时间】:2016-05-21 18:23:23
【问题描述】:

我有以下代码在 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命令行参数大小限制有关?

【问题讨论】:

  • 传递给argc/argv 的内容取决于编译器的实现。在调用 GetCommandLineWCommandLineToArgvW 而不是使用 argv 时,您是否看到相同的行为?当您在调试器中检查时,argv[0] 的值是多少?
  • 你正在混合苹果和橙子:cwdBuffer = _wgetcwdlen = wcslen(argv[0])
  • @Dieter Lucking,对不起,如果我的 Win-cpp 知识很基础,但这些观点是相互关联的吗?我从谷歌上选择了这段代码,所以我不知道哪些行几乎不需要,我尝试过长路径,但是大多数路径都被完整复制,只有一些路径没有完全复制,这可能是 Unicode 字符串问题吗?跨度>
  • 我确实收到了[Warning] second argument of 'int main(int, wchar_t**)' should be 'char **' [-Wmain] 的警告,但如果我像往常一样使用char 类型,则会出现错误。
  • 当前工作目录命令行是两条不相关的信息。您正在检索第一个命令行参数的长度,并将当前工作目录截断为尽可能多的字符。删除 cwdBuffer 并用 argv[0] 替换所有出现的地方。

标签: c++ windows command-line clipboard


【解决方案1】:

感谢所有 cmets,他们为我指明了正确的方向,我能够使脚本完全运行。

我删除了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;
}

【讨论】:

  • “我能够让脚本完全运行” - 不。并不真地。您仍然痴迷于使用当前工作目录。当前工作目录完全没用,不应该用于任何事情。如果要访问命令行,请通过argc/argv。目前还不清楚,您真正想要实现什么。无论如何,这个答案并不能解决任何实际的编程问题。
猜你喜欢
  • 2012-02-25
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2012-02-25
相关资源
最近更新 更多