2011-11-28 2 views
5

У меня возникла проблема с запуском на сервере Winapi::findFirstFile. я havve уже пытался копировать метод на классе WinapiServer, и изменить некоторые строки, например:Попробуйте использовать Winapi :: findFirstFile, запущенный на сервере

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)]; 
} 

Но теперь у меня есть еще один вид ошибки Функция «FindFirstFileW» на библиотеки DLL «KERNEL32» выдает исключение.

Это потому, что я выполняю метод на сервере x64. Кто-нибудь, кто решил решить эту проблему?

+0

Вы указали точное сообщение об ошибке из информационного журнала? –

+0

Какое исключение он бросает? Возможно, AX выбрасывает, поскольку WinAPI не генерирует исключений, он возвращает коды ошибок. Попробуйте 'WinAPIServer :: getLastError()', чтобы получить код ошибки –

ответ

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; 
} 

тестовое задание

Чтобы проверить код выше, я создал следующие примеры файлов в пути 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

Надежда, что помогает.

0

Я обнаружил, что классы .NET ожидают System.String вместо str.Ссылаясь на:

directory = new System.IO.DirectoryInfo(_folderPath); 

При компиляции CIL я получаю:

Не удается создать запись в информации Compiler (TmpCompilerOutput). Путь: \ Классы \\, Предупреждение: Прокси-сервер не найден. Тип FileIOPermission найден в стеке. Этот код в классе:, Метод:.

Моим решением является назначение _folderPath для System.String.

 Смежные вопросы

  • Нет связанных вопросов^_^