【发布时间】: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的内容取决于编译器的实现。在调用 GetCommandLineW 或 CommandLineToArgvW 而不是使用argv时,您是否看到相同的行为?当您在调试器中检查时,argv[0]的值是多少? -
你正在混合苹果和橙子:
cwdBuffer = _wgetcwd和len = 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