Альтернативы System.web.ui.page

Я не знаю, почему вы думаете, что map будет проблемой. Способ, которым он называется (создание списка из него ), работает одинаково в обеих версиях Python .

Posting [Python 3]: ctypes - библиотека сторонних функций для Python .

Я не могу быть на 100% уверен без документации по функциям, но по тому, как они объявлены:

  1. olDaInitialize :

    prototype = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(ctypes.c_ulong))
    paramflags = (1, "name"), (2, "hDev")
    
  2. olDaGetDASS :

    prototype = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_ulong, ctypes.c_long, ctypes.c_uint, ctypes.POINTER(ctypes.c_ulong))
    paramflags = (1, "hDev"), (1, "SubsystemType"), (1, "uiElementNr"), (2, "adhandle")
    

Я могу заключить, что возвращаемые значения представляют собой статусы выполнения функций , обычно:

  • 0 для успеха
  • Любое другое значение int , представляющее код ошибки

Но в Initialize вы устанавливаете hDev (который выводится для olDaInitialize и вводится для olDaGetDASS ) вот так (есть также несоответствие типов, но оно скрывается автоматическим приведением):

hdev = olDaInitialize(name)
self.hdev = hdev

, поэтому вы присваиваете hdev статус olDaInitialize [ 1124], который не имеет смысла. Правильный способ сделать это:

  • В __ init __ :

    self.hdev = ctypes.c_ulong(0)
    
  • В Initialize :

    hdev = ctypes.c_ulong(0)
    status = olDaInitialize(name, ctypes.byref(hdev))
    if status == 0:  # Or whichever value means SUCCESS
        self.hdev = hdev
    

То же самое относится и к adhandle ( olDaGetDASS последний аргумент), на который вы ссылаетесь в GetSubsystem (как sshandle ) и, вероятно, используете другое место в коде.

Пока мы находимся в разделе улучшений:

  • Имя передается как __ init __ , так и ] Initialize кажется излишним. Я бы предложил оставить его в инициализаторе, а в теле сделать:

    self.name = name.encode("utf-8")
    

    , а затем удалить аргумент из Initialize и использовать self.name внутри него

  • Вы используете errcheck функциональность, но сейчас это совсем не помогает. Вы можете улучшить это (например, отображая код ошибки). Подробнее о [SO]: Как использовать errcheck ctypes? (Ответ @ CristiFati)

  • Инициализация вызывается дважды: в основном скрипте и в setupGetSingleValue . Вы должны удалить вызов из одного места (я бы сказал, последнее)

  • olDaEnumBoards listboardscallback ) не хватает. Кроме того, где напечатаны 1 st sup> 2 строки ?

  • Попробуйте сохранить согласованность имен ваших идентификаторов ( [Python] : PEP 8 - Руководство по стилю для кода Python )

@ EDIT0 :

Добавление некоторых упрощенных код, чтобы проверить, воспроизводит ли проблема.

code.py :

#!/usr/bin/env python3

import sys
import ctypes


def main():
    oldaapi64 = ctypes.CDLL(find_library("oldaapi64"))
    olmem64 = ctypes.CDLL(find_library("olmem64"))

    oldainitialize = oldaapi64.olDaInitialize
    oldainitialize.argtypes = [
        ctypes.c_char_p, ctypes.POINTER(ctypes.c_ulong),
    ]
    oldainitialize.restype = ctypes.c_int

    oldagetdass = olmem64.olDaGetDASS
    oldagetdass.argtypes = [
        ctypes.c_ulong, ctypes.c_long, ctypes.c_uint, ctypes.POINTER(ctypes.c_ulong),
    ]
    oldagetdass.restype = ctypes.c_int

    dev = ctypes.c_ulong(0)
    res = oldainitialize(b"DT9818(00)", ctypes.byref(dev))
    print("{:s} returned {:d}. Dev: {:d}".format(oldainitialize.name, res, dev.value))

    OLSS_AD = 0
    element_num = 0
    handle = ctypes.c_ulong(0)
    res = oldagetdass(dev, OLSS_AD, element_num, ctypes.byref(handle))
    print("{:s} returned {:d}. Handle: {:d}".format(oldagetdass.name, res, handle.value))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()
    print("Done.")

5
задан Kibbee 25 February 2009 в 15:26
поделиться

3 ответа

Большинство статей, которые я нашел, где, говоря об использовании Страницы как базовый класс и реализация функциональности вдобавок ко всему, это похоже на Вас, должно сделать Ваш собственный класс MyPage, который реализует IHttpHandler

Из статьи MSDN


using System.Web;

namespace HandlerExample { public class MyHttpHandler : IHttpHandler { // Override the ProcessRequest method. public void ProcessRequest(HttpContext context) { context.Response.Write("This is an HttpHandler Test.");
context.Response.Write("Your Browser:"); context.Response.Write("Type: " + context.Request.Browser.Type + ""); context.Response.Write("Version: " + context.Request.Browser.Version); }

  // Override the IsReusable property.
  public bool IsReusable
  {
     get { return true; }
  }

} }

Снова, от статьи: Для использования этого обработчика включайте следующие строки в файл Web.config.


<configuration>
   <system.web>
      <httpHandlers>
         <add verb="*" path="handler.aspx" type="HandlerExample.MyHttpHandler,HandlerTest"/>
      </httpHandlers>
   </system.web>
</configuration>

Я смотрел бы на исходный код для System.web.ui.page и смотрел бы на то, что он делает для руководства Вас. Мое предположение - то, что это главным образом просто называет различные методы в жизненный цикл страницы asp.net в правильном порядке. Вы сделали бы что-то подобное путем вызова собственного page_load из метода ProcessRequest. Это направило бы к Вашей отдельной реализации Ваших классов, которые реализуют Ваш MyPage.

Я никогда не думал о выполнении чего-то вроде этого прежде, и это звучит довольно хорошим, так как я действительно не использую ни одной чрезмерно увеличенной в размерах функциональности веб-форм. MVC может сделать это целое осуществление бесполезным, но это действительно кажется крутым.

Мой быстрый пример

новая основа:


using System.Web;
namespace HandlerExample
{
    // Replacement System.Web.UI.Page class
    public abstract class MyHttpHandler : IHttpHandler
    {
        // Override the ProcessRequest method.
        public void ProcessRequest(HttpContext context)
        {
            // Call any lifecycle methods that you feel like
            this.MyPageStart(context);
            this.MyPageEnd(context);
        }

    // Override the IsReusable property.
    public bool IsReusable
    {
        get { return true; }
    }

    // define any lifecycle methods that you feel like
    public abstract void MyPageStart(HttpContext context);
    public abstract void MyPageEnd(HttpContext context);

}

Реализация для страницы:



// Individual implementation, akin to Form1 / Page1
public class MyIndividualAspPage : MyHttpHandler
{

    public override void MyPageStart(HttpContext context)
    {
        // stuff here, gets called auto-magically
    }

    public override void MyPageEnd(HttpContext context)
    {
        // stuff here, gets called auto-magically
    }
}

}

9
ответ дан 13 December 2019 в 05:43
поделиться

Если Вам не нужен весь этот "материал asp.net", можно хотеть реализовать пользовательский IHttpHandler. Afaik, нет никаких других стандартных IHttpHandlers к повторному использованию кроме класса Page.

3
ответ дан 13 December 2019 в 05:43
поделиться

Чтобы сделать это, необходимо запустить путем рассмотрения Системы. Сеть. Класс UI.PageHandlerFactory и соответствующая Система. Сеть. Интерфейс IHttpHandlerFactory.

Оттуда Вы, вероятно, посмотрите на Систему. Сеть. IHttpHandler inferface и Система. Сеть. Класс UI.Page.

В основном Вы запишете свой собственный IHttpHandlerFactory, который генерирует IHttpHandlers, который обрабатывает запросы страницы.

0
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: