gpt4 book ai didi

axapta - 尝试使用在服务器上运行的 Winapi::findFirstFile

转载 作者:行者123 更新时间:2023-12-02 11:48:04 25 4
gpt4 key购买 nike

我在尝试运行在服务器上运行的 Winapi::findFirstFile 时遇到问题。我已经尝试复制 WinapiServer 类上的方法,并更改一些行,如下所示:

server static container findFirstFile(str filename)
{
InteropPermission interopPerm;
Binary data;
DLL _winApiDLL;
DLLFunction _findFirstFile;
;

interopPerm = new InteropPermission(InteropKind::DllInterop);
interopPerm.assert();

data = new Binary(592); // size of WIN32_FIND_DATA when sizeof(TCHAR)==2
_winApiDLL = new DLL(#KernelDLL);
_findFirstFile = new DLLFunction(_winApiDLL, 'FindFirstFileW');

_findFirstFile.returns(ExtTypes::DWord);

_findFirstFile.arg(ExtTypes::WString,ExtTypes::Pointer);

return [_findFirstFile.call(filename, data),data.wString(#offset44)];
}

但是现在我遇到了另一种错误库 DLL“KERNEL32”上的函数“FindFirstFileW”引发异常。

这是因为我在 x64 服务器上执行该方法。有人有解决这个问题的想法吗?

最佳答案

这是一个示例代码,它在客户端和服务器端都适用于我。它使用 .NET 命名空间来获取给定模式的给定文件夹路径中的文件列表。

您可以修改它以创建您自己的服务器端版本的 FindFirstFile 方法。

X++ 代码

static container findMatchingFiles(
str _folderPath
, str _filePattern = '*.*')
{
System.IO.DirectoryInfo directory;
System.IO.FileInfo[] files;
System.IO.FileInfo file;
InteropPermission permission;

str fileName;
counter filesCount;
counter loop;
container mathchingFiles;
;

permission = new InteropPermission(InteropKind::ClrInterop);
permission.assert();

directory = new System.IO.DirectoryInfo(_folderPath);
files = directory.GetFiles(_filePattern);
filesCount = files.get_Length();

for (loop = 0; loop < filesCount; loop++)
{
file = files.GetValue(loop);
fileName = file.get_FullName();
mathchingFiles = conins(mathchingFiles, conlen(mathchingFiles) + 1, fileName);
}

CodeAccessPermission::revertAssert();

return mathchingFiles;
}

测试作业

为了测试上述代码,我在路径 C:\temp\Files\

中创建了以下示例文件

List of files

我将上述方法放置在名为Tutorial_WinApiServer的示例类中。然后,使用以下代码创建一个名为 fetchFiles 的作业。

static void fetchFiles(Args _args)
{
container files;
counter loop;
str fileName;
;

files = Tutorial_WinApiServer::findMatchingFiles(@'C:\temp\Files', '*.txt');

for (loop = 1; loop <= conlen(files); loop++)
{
fileName = conpeek(files, loop);
info(fileName);
}
}

执行作业给出以下输出。

Job Output 1

将文件模式更改为 F*.* 后,作业产生以下输出。

Job Output 2

希望有帮助。

关于axapta - 尝试使用在服务器上运行的 Winapi::findFirstFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8300111/

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