gpt4 book ai didi

drag-and-drop - 我可以将项目从 Outlook 拖到我的 SWT 应用程序中吗?

转载 作者:行者123 更新时间:2023-12-04 07:28:56 46 4
gpt4 key购买 nike

背景

我们基于 Eclipse RCP 3.6 的应用程序允许人们将文件拖入进行存储/处理。当文件从文件系统中拖出时,这可以正常工作,但当人们直接从 Outlook 中拖出项目(消息或附件)时就不行了。

这似乎是因为 Outlook 希望通过 FileGroupDescriptorW 向我们的应用程序提供文件。和 FileContents ,但 SWT 只包含一个 FileTransfer类型。 (在 FileTransfer 中,只传递文件路径,假设接收者可以定位和读取它们。FileGroupDescriptorW/FileContents 方法可以直接提供应用程序到应用程序的文件,而无需将临时文件写入磁盘。)

我们试图生产一个 ByteArrayTransfer可以接受的子类 FileGroupDescriptorWFileContents .根据网络上的一些示例,我们能够接收并解析 FileGroupDescriptorW ,它(顾名思义)描述了可用于传输的文件。 (请参阅下面的代码草图。)但我们一直无法接受 FileContents .

这似乎是因为 Outlook 提供了 FileContents数据仅作为 TYMED_ISTREAMTYMED_ISTORAGE ,但 SWT 只知道如何交换数据为 TYMED_HGLOBAL .其中,似乎 TYMED_ISTORAGE会更可取,因为不清楚如何 TYMED_ISTREAM可以提供对多个文件内容的访问。

(鉴于我们需要处理两个类型,我们也对 SWT 只选择和转换单个 TransferData 类型的愿望有一些担忧,但我们认为我们可能会以某种方式在 Java 中解决这个问题:似乎所有 TransferData s 在过程的其他点可用。)

问题

我们在正确的轨道上吗?有没有人设法接受FileContents在 SWT 了吗?我们有没有可能处理TYMED_ISTORAGE数据而不离开 Java(即使通过为 SWT 创建基于片段的补丁或派生版本),或者我们是否也必须构建一些新的 native 支持代码?

相关代码片段

提取文件名的草图代码:

    // THIS IS NOT PRODUCTION-QUALITY CODE - FOR ILLUSTRATION ONLY
final Transfer transfer = new ByteArrayTransfer() {
private final String[] typeNames = new String[] { "FileGroupDescriptorW", "FileContents" };
private final int[] typeIds = new int[] { registerType(typeNames[0]), registerType(typeNames[1]) };

@Override
protected String[] getTypeNames() {
return typeNames;
}

@Override
protected int[] getTypeIds() {
return typeIds;
}

@Override
protected Object nativeToJava(TransferData transferData) {
if (!isSupportedType(transferData))
return null;

final byte[] buffer = (byte[]) super.nativeToJava(transferData);
if (buffer == null)
return null;

try {
final DataInputStream in = new DataInputStream(new ByteArrayInputStream(buffer));

long count = 0;
for (int i = 0; i < 4; i++) {
count += in.readUnsignedByte() << i;
}

for (int i = 0; i < count; i++) {
final byte[] filenameBytes = new byte[260 * 2];
in.skipBytes(72); // probable architecture assumption(s) - may be wrong outside standard 32-bit Win XP
in.read(filenameBytes);
final String fileNameIncludingTrailingNulls = new String(filenameBytes, "UTF-16LE");
int stringLength = fileNameIncludingTrailingNulls.indexOf('\0');
if (stringLength == -1)
stringLength = 260;
final String fileName = fileNameIncludingTrailingNulls.substring(0, stringLength);
System.out.println("File " + i + ": " + fileName);
}

in.close();

return buffer;
}
catch (final Exception e) {
return null;
}
}
};

在调试器中,我们看到 ByteArrayTransferisSupportedType()最终返回 falseFileContents因为下面的测试没有通过(因为它的 tymedTYMED_ISTREAM | TYMED_ISTORAGE ):
    if (format.cfFormat == types[i] &&
(format.dwAspect & COM.DVASPECT_CONTENT) == COM.DVASPECT_CONTENT &&
(format.tymed & COM.TYMED_HGLOBAL) == COM.TYMED_HGLOBAL )
return true;

此摘自 org.eclipse.swt.internal.ole.win32.COM让我们对简单解决方案的希望越来越小:
public static final int TYMED_HGLOBAL = 1;
//public static final int TYMED_ISTORAGE = 8;
//public static final int TYMED_ISTREAM = 4;

谢谢。

最佳答案

你看了吗https://bugs.eclipse.org/bugs/show_bug.cgi?id=132514 ?

附加到这个 bugzilla 条目的是一个补丁(针对一个相当旧的 SWT 版本),它可能会引起人们的兴趣。

关于drag-and-drop - 我可以将项目从 Outlook 拖到我的 SWT 应用程序中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690236/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com