JOS*_*_24 5 ax axapta dynamics-ax-2009
我试图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)];
}
Run Code Online (Sandbox Code Playgroud)
但现在我有另一种错误 库DLL'KERNEL32'上的'FindFirstFileW'函数抛出一个异常.
这是因为我正在x64服务器上执行该方法.有想法解决这个问题的人吗?
小智 6
这是一个在客户端和服务器端都为我工作的示例代码.它使用.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;
}
Run Code Online (Sandbox Code Playgroud)
测试工作
为了测试上面的代码,我在路径中创建了以下示例文件 C:\temp\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);
}
}
Run Code Online (Sandbox Code Playgroud)
执行该作业给出了以下输出.

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

希望有所帮助.