Re[33]: Ну вот опять новости
От: Roman_M rgmroman.narod.ru
Дата: 25.06.03 13:22
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Здравствуйте, Roman_M, Вы писали:



R_M>>>>Потребуется как минимум Mac, так как нигде написано про наличие версии этой программы для Windows.

PE>>>Нюню. Ты думаешь эксель поддерживает тьлько формат xls ?
PE>>>Конвертер написать — два пальца о асфальт.
R_M>>То-то и она, что надо писать, а там ведь таблицы, а не просто данные. Если писать, то можно и для Линуксового офиса написать.
PE>Обычно на заводе используется одна система. На ней все и крутится.

Так оно обычно и есть, и это не я писал про "другие условия" и "другого директора" и т.п.

R_M>>Так вот если повсеместно в госорганизациях будет Linux, то, естественно, будут и бизнес-приложения под Linux, и документооборот с госучреждениями будет удобно вести используя линуксовые офисы и программы.


PE>А если сейчас везде стоит Винда, то в винде не круто вести документооборот ?


Ведут в Windows, это кстати одна из причин того, почему затруднен переход на официально бесплатный Linux с Windows (который в России тоже бесплатен, но только до первой проверки).
Re[54]: Windows vs Linyx
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.03 13:33
Оценка: 1 (1)
Здравствуйте, vvaizh, Вы писали:

V>Чё то мы всё херню обсуждаем какую то..

V>Давайте киньте мне код, который вы __уже__ написали, и посмотрим

Я пишу то, что сам писал, окей ?

OLE в чистом виде да еще на Си — это не часто увидишь.

BOOL SavePictureIndirect(PICTDESC pDesc,LPCTSTR szPath)
{
    IPicture* pPicture = NULL;
    BOOL bResult = TRUE;

    OleCreatePictureIndirect(&pDesc,&IID_IPicture,FALSE,(void**)&pPicture);
    if(pPicture == NULL)
        bResult = FALSE;
    else
    {
        pPicture->lpVtbl->AddRef(pPicture);
        bResult = SavePicture(pPicture,szPath);
    }
    if(pPicture != NULL)
        pPicture->lpVtbl->Release(pPicture);
    return bResult;
}

BOOL SavePicture(IPicture* pPicture,LPCTSTR szPath)
{
    HRESULT hr;
    int size = strlen(szPath);
    BSTR bstrPath = SysAllocStringByteLen(szPath,size*2);
    
    MultiByteToWideChar(CP_ACP,0,szPath,size, bstrPath, size*2);
    
    hr = OleSavePictureFile((LPDISPATCH)pPicture,bstrPath);
    
    SysFreeString(bstrPath);
    
    return SUCCEEDED(hr);
}
Re[32]: Windows vs Linyx
От: Roman_M rgmroman.narod.ru
Дата: 25.06.03 13:37
Оценка:
Здравствуйте, Ведмедь, Вы писали:

В>Здравствуйте, Roman_M, Вы писали:


R_M>>Здравствуйте, Sinclair, Вы писали:



R_M>>В эксплорере часто оказывает невозможно сделать много функций, он хорош чтобы показать как круто работать в GUI, но в реальной жизни часто много не хватает. И судя потому, что такая простая вещь, как консольный таск-менеджер, появиласть только в поставке WinXP, то нормального развития эксплорера можно вообще не дождаться.


В>Не хватает так добавь, в чем проблема? Его же можно расширять Как это делает WinRar, например.


Наверное проще будет свой с нуля написать.
Что такое делает WinRar кроме сопоставления расширений файлов себе и добавления в контекстное я что-то не могу припомнить, ну еще drag-n-drop поддерживает.
Re[56]: Windows vs Linyx
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.03 13:45
Оценка:
Здравствуйте, vvaizh, Вы писали:

PE>>Ага. И надо иметь либы для С, С++, Паскаля, Жавы, Питона, Перла, Руби и тд и тд — сколько языков, столько и либ ? Не многовато ли ?


V>формат *.so он для всех языков один..

V>как и формат *.dll в винде..

Я не про это.

V>Так что в перечисленных тобой фзыках

V>нужно иметь только враппер, чтобы вызывать оттуда функции (из *.so),
V>что давно уже сделано для всех перечисленных тобой языков (да я думаю и раньше OLE тоже..)..

Естественно раньше. OLE-ActiveX-COM решают пролемы, возникающие в использовании ДЛЛ.

V>Ну и чем это удобнее наименования библиотеки и функций в ней?


1. Билиотека и так именуется. Только находиться может где угодно.
2. Функция как таковая не существует. Есть объект и у него есть методы. ООП.

PE>>Если ты пишешь аппликацию, которая сможет работать с разными компонентами, то эти компоненты должны иметь одинаковый внешний программный интерфейс.

PE>>Для этого есть средства соответсвующие.
V>Как они компоненты идентифицировать будут?
V>Как ты свой компонент идентифицировал?

IUnknown везде и всюду одинаков !

V>Что ты мне всё "есть" да "есть"...

V>Ты мне напиши, как ты "уже" сделал..
V>А я посмотрю, удобнее это и проще, чем использование функций из библиотек или нет..

У нас используется COM. Тебе должно ыть известны достоинства и недостатки COM по сравнению с ДЛЛ.


PE>>>>Для COM это все не надо. Даже имени длл.

V>>>А как же ты компонент проидентифицируешь?
PE>>"Word.Application"
PE>>"Excel.Application"
V>Стоп..
V>Вот ты перечислил 2 системы..
V>Из твоей речи выше я так понял что есть 1!!!!!! компонент, который используется всеми остальными..
V>Но ты почему то используешь не его, а что то другое (ворд)
V>Этого компонента нет?
V>Или он в ворде и ексель свой?
V>Чего ты мне чепуху то городишь..
V>Назови компонент, который используется в 10-ит системах, и который 1!

MSXML, WebBrowser, MSHTML

V>И как ты его идентифицируешь..


WebBrowser.Application
MSXML.Document
MSHTML.Document


V>Я рад, жалко только что не твои плагины не всегда работают..

PE>>Не нужно никаких врапперов.
V>Ну и какой C++ класс у тебя создаётся?
V>Тоже апишный?

Я даже не знаю, класс ли это. АПИ возвращает указатель на интейфейс IUnknown.


V>>>>>Для JS ?

V>>>Аналогично
V>>>CreateObject — это и есть wrapper OLE для JS..
PE>>CreateObject — это враппер для АПИ функции CoCreateInstance и только.
PE>>JS сам умеет работать с COM.
V>JS — сам по себе большой враппер, а не язык, своих собственных средств у
V>него очень мало, он как и vbs язык специально заточенный MS под COM..
V>(по крайней мере то, что в Win называется JS..)

В точку. Но это не враппер, а язык. Библиотека ему не нужна — она уже есть в самом Ворде, экселе и тд.

PE>>>>Я ком юзал из С и Asm. Врапперов нет. Дядя, не смеши. Ты COM — я уверен — не знаешь. Без обид.

V>>>
V>>>Я чувствую, что ты так думаешь..
V>>>Жаль тебя разочаровывать, но пару/тройку ком компонентов я написал, а сколько
V>>>использовал, вообще считать страшно..
PE>>Я понимаю тебя. Я по большому счету ничего не писал, кроме COM компонентов и тд.
V>А ну тогда всё понятно..
V>Узкий специалист подобен флюсу — полнота его односторонняя
V> (с) Козьма Прутков
V>Тебе видимо просто не с чем сравнивать..
V>Так что ты меня всё таки не понимаешь..

Мне есть с чем сравнивать. ДЛЛ — это уровень С. COM — это уровень С++, JS, ObjPascal и тд (ООП).

V>Вот тогда прокомментируй высказывание, что минимальный объём проги использующий чистый С — OLE — 2000

V>строк.. В отличие от ispell, который можно использовать вызовом нескольких строчек..
V>И уж тем более, в asm..

Ну ты даешь. Что делает прога в 2000 строк ?

Вот минимальная прога
А чуть ниже я еще прожку подкинул

#include <Windows.h>

int main(int argc, char* argv[])
{
   CoInitialize(0);

   
   CoUninitialize()
}


PE>>OLE — это старое понятие. OLE были в основном в ДЛЛ. Сейчас это не так. Ты же не только спелчекеры используешь.


V>Ну COM, какая разница.. Ты мне всё таки объясни, преимущества использования спеллчеккера через COM.

V>Про то что попадает в описанные мною 4 пункта, не нужна, для таких компонентов преимущества я знаю.

Использование спеллчекера не нужно делать чз COM если ты его сам пишешь.
Но если мне нужно использовать готовый, чтобы время с экономить ?

Где мне скачать спелчекер для всех 7 языков ?

#include "stdio.h"        

#include "parser.h"

using namespace MSXML2;

void checkParseError(IXMLDOMParseErrorPtr pError);
void dump_com_error(_com_error &e);

int wmain(int argc, wchar_t* argv[])  
{
    int nRet = 0;
    BOOL bVerbose = FALSE;

    if( argc < 2 )
    {
        wprintf(L"\nUsage : %s fullpath\\filename.xml\n",argv[0]);
        return -1;
    }

    if( argc > 2 && lstrcmp(argv[2],L"verbose")==0 )
        bVerbose = TRUE;
    
    CoInitialize(NULL);
    HRESULT hr;
    VARIANT_BOOL vbRet;
    
    try{
        IXMLDOMDocumentPtr pXMLDoc;
        IXMLDOMDocument2Ptr pXMLDoc2;
        IXMLDOMDocumentPtr pXSDDoc;
        long err;
        _bstr_t    bstrXSDFileName;
        
        CLSID clsid;
        
        hr = CLSIDFromProgID(L"Msxml2.DOMDocument.4.0", &clsid);
        

        hr = pXMLDoc.CreateInstance(clsid);

        pXMLDoc->validateOnParse = VARIANT_FALSE;
        pXMLDoc->async = VARIANT_FALSE;
        vbRet = pXMLDoc->load( argv[1] );      

        if(vbRet != VARIANT_TRUE)
        {         
            checkParseError(pXMLDoc->parseError);
            throw -1;
        }

        IXMLDOMNodePtr pNode = pXMLDoc->firstChild;
        pNode = pNode->nextSibling;

        _bstr_t xml =  pNode->xml;

        if(pNode != NULL)
        {
            VARIANT value;

            IXMLDOMAttributePtr pAttr =    pNode->Getattributes()->getNamedItem(L"Version");

            if(pAttr == NULL)
                bstrXSDFileName = L"vpi_tpm391.xsd";
            else
            {
...............................
            }

            if(bVerbose)
                wprintf(L"Schema file : %s\n",(wchar_t* )bstrXSDFileName);
        }
        
        hr = pXSDDoc.CreateInstance(clsid);
        
        pXSDDoc->async = VARIANT_FALSE;
        vbRet = pXSDDoc->load(bstrXSDFileName);

        if( vbRet != VARIANT_TRUE )
        {
            checkParseError(pXSDDoc->parseError);
            throw -1;
        }
        
        IXMLDOMSchemaCollectionPtr pSchemaCache;

        hr = CLSIDFromProgID(L"Msxml2.XMLSchemaCache.4.0", &clsid);

        hr = pSchemaCache.CreateInstance(clsid);
        
        //hook it up with XML Document
        hr = pSchemaCache->add("vpi_tpm", pXSDDoc.GetInterfacePtr());   
        

        pXMLDoc2 = pXMLDoc;

        pXMLDoc2->schemas = pSchemaCache.GetInterfacePtr();
        
        
        IXMLDOMParseErrorPtr pError = pXMLDoc2->validate();

        err = pError->errorCode;
        
        //check on the parser error      
        if(err != 0)
        {
            checkParseError(pError);
            throw -1;
        }
    }
    catch(_com_error &e)
    {
        dump_com_error(e);
        nRet = -1;
    }

    catch(int r)
    {
        nRet = r;        
    }

    if( !nRet && bVerbose)
        wprintf(L"File OK !\n");
    return nRet;
}


void checkParseError(IXMLDOMParseErrorPtr pError)
{
    _bstr_t bstrErr(pError->reason);
    _bstr_t bstrSrc(pError->srcText);
    wprintf(L"Error:\n");
    wprintf(L"Code = 0x%x\n", pError->errorCode);
    wprintf(L"Error Description = %s\n", (char*)bstrErr);
    wprintf(L"Line = %ld\n", pError->line);
    wprintf(L"XML = %s\n", (char*)bstrSrc);
}

void dump_com_error(_com_error &e)
{
    wprintf(L"Error\n");
    wprintf(L"\a\tCode = %08lx\n", e.Error());
    wprintf(L"\a\tCode meaning = %s", e.ErrorMessage());
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    wprintf(L"\a\tSource = %s\n", bstrSource);
    wprintf(L"\a\tDescription = %s\n", bstrDescription);
}
Re[51]: Windows vs Linyx
От: vvaizh http://izh-test.sourceforge.net/
Дата: 25.06.03 13:45
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Здравствуйте, vvaizh, Вы писали:


PE>Враппер — это кусочек кода, который превратится в машинный код.


http://ooad.asf.ru/patterns/patterninfo.asp?ID=12

PE>Заголовочный файлик с интефейсами — это просто смещения для вызова методов.

PE>Я так понял, ты называешь враппером IDL ?

Именно, и я думал, это общепринято..

PE>Распространяется обычно бинарник и tlb в одном флаконе. все генерируется автоматом.

Да, автоматом — это круто..
Но — не нужно если этот самый *.h уже есть, как и все исходники..

PE>Если ты не используешь COM, как тебе получить заголовок и библиотеку для языка например Pascal ?

PE>На сайте разработчика только для C/C++ есть. Что удешь делать ? Ничего. Искать другую.
Сгенерируй мне wrapper для паскаля..
И, кстати для какого ещё непонятно..
И потом для других языков конвертилок *.h-> в них тоже до фига..
Хотя я в принципе с тобой согласен, что idl баще конвертилок из *.h файла..
Но.. опять же в случае ispell, все wrapper-ы уже есть..

Хотя... наличие tlb-файла конечно шаг вперёд..
А idl формат он не OLE-шный, он общий (в CORBA такой же)..
Так что при необходимости, и на linux его вполно испльзуют..
А для ispell он не нужен опять же повторяю, потому, что
родных врапперов для всех языков навалом..

PE>По этой причине ZLib распространяется с необходимыми файлами для ВСЕХ языков.

PE>Для питона и перла она продублирована на 100%
PE>Ты можешь дать гарантию, что тот, кто писал ZLib для питона,
PE>не ошибся ни разу или совершил теже ошибки, что есть в варианте С/С++ ?
PE>И не только ZLib.
ZLib — один на всех..
на языках только врапперы..
Или ты серъёзно думаешь, что кто то запускает такие долгоиграющие вещи, как сжатие данных на интерпретируемых языках..
Ты глубоко заблуждаешься..

PE>В QT для Pascal чтобы не дублировать код, пришлось писать РУКАМИ врапперы, которые просто перенаправляют вызовы в QT для C/C++.

Ага... MFC вот тоже класса QT.. я что то не слышал, чтобы она на OLE была основана..
И вообще что она на паскале есть.. Хоть с врапперами, хоть без врапперов..

PE>В COM такого нет !

Дык и Попуоярной оконной библиотеки, основанной на COM нет..

PE>>>Мну нужно

PE>>>или 7 разных компонент
PE>>>или 1 компонента и 7 библиотек
V>>Нет, тебе нужен 1 компонент, а во всех языках врапперы для него..
PE>Значит 7 врапперов по твоему ?
А что, по твоему не 7?

V>>Точто так же как и для OLE..

PE>Какой враппер для OLE нужен ? Что это такое ? CComPtr ?
Не он сам, а то что у него в скобках <>
А сам он — тоже wrapper, но только не для spellchecker-а а для OLE..

PE>COM — это враппер сам для себя ! IDL — это COM, а не враппер.

IDL — это международный стандарт..
Он и в CORBA используется..

PE>>>или 1 компонента, которая свободно, без врапперов, подымается из любого языка.

V>>Вот список врапперов, которые ты используешь:
V>>1. "голый" OLE на С
PE>Какой же это враппер ? Я вызываю функцию АПИ напрямую и получаю указатель на структуру из указателей.
PE>Где врапперы ?
API чего? Ядра? Стандартной библиотеки C?
какая либа подключается? Вот эта либа и враппер..

V>>2. библиотека на C++ для него

PE>Что такое библиотека С++ для него ?
Представляющая для удобства "чистый" C-OLE в виде классов
Что там ты используешь..
MFC, ATL, что то другое?
Если используешь конечно..

V>>3. заголовок, созданный из tlb-файла, или не знаю как ты его там создал..

PE>Это генерируется по tlb и выглядит одинаково для всех библиотек во всех языках.
Кто? заголовок? А... Вспомнил..
Ты про слово import наверно..
А оно точно входит в стандарт C++?
Уж не говоря о том, чтобы idl входил в остав других языков..

PE>Это не врапперы — это просто заголовки. Вот для Питона и Перла нужны врапперы. Они не умеют с COM работать.

Для C++ они тоже нужны.. это всё таки стандартизованный язык..
И MSVС имеет к нему отнрошение (по планам MS будет иметь, к не помню какому году.. только на 95%)

PE>Враппер — COleDispatchDriver СPictureHolder COleStreamFile

PE>Посмотри, пожалуйста, на эти врапперы и сравни с интерфейсами соответсвующими.
Я что то должен увидеть?
Ты пальцем покажи..
Я пока что вижу, что врапперы есть..
как должны они быть и для
http://izh-test.sourceforge.net/russian/introduction.html
Re[32]: Windows vs Linyx
От: Roman_M rgmroman.narod.ru
Дата: 25.06.03 13:47
Оценка:
Здравствуйте, m.a.g., Вы писали:

MAG>Здравствуйте, Roman_M, Вы писали:


S>>>Очень хороший пример. В качестве замены команде dir MS предлагает диалог поиска файлов. В принципе, это хорошая и последовательная замена, поскольку

R_M>>Конечно уже давно пришло время заменить командную строку на GUI-интерфейс, но замена все таки не очень хорошая.

MAG>Скорее, "командную строку дополнить чем-нибудь еще". Я еще раз отсылаю к The anti-mac interface по поводу невозможности полной отмены командной строки. Честно скажу, эта статья очень сильно изменяет сознание По крайней мере, его эманации, связанные с фразой "консоль отстой".


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

S>>>1. она позволяет даже неумелому пользователю использовать достаточно сложные условия для этого поиска (попробуйте в с помощью той же dir дополнительно ограничить файлы теми, которые были модифицированы в течение последней недели)

R_M>>В Linux консольные программы развиты гораздо лучше, консоль на уровне MS-DOS конечно же не очень приспособлена для таках вещей. С тем что работа в консоле Windows ужасна и спорить нечего.

MAG>Честно говоря, идеальный find мне видится таким:


MAG>

Мне тоже так кажется.

MAG>Вариант — это две морды над одной библиотекой. Библиотеку разрешается сделать COM-компонентом. Библиотеку и консольную морду пишут юниксоиды, гуевую — виндузятники. Никто не обижен. У всех есть привычные фишки. Дублирования кода нет. Ляпота. Только никогда этого не будет...


Вот это похоже на правду, это же так офигительно трудно реализовать.

R_M>>Ну в голой командной строке тоже не часто работают, её уже давно используют как вспомогательный инструмент, а все базовые операции делаются на какой-нибудь оболочке типа far, dn, mc, nc.

MAG>В винде — да, из-за убогости консоли. А вот в линуксе bash будет помощнее cmd.

Бесспорно помощнее, но все равно удобней использовать mc, чем только одну командную строку.
Re[24]: Windows vs Linyx
От: Roman_M rgmroman.narod.ru
Дата: 25.06.03 13:51
Оценка: :))
Здравствуйте, mihailik, Вы писали:

MAG>> cron придуман был невесть когда и до сих пор успешно работает. А в винде...

M>Нет, это в Линуксе кругом сакс, а а Windows NT шедулер с самого начала.

"Вынь скас, вынь сакс" — кричали, а что такое "сакс" и откуда его вынимать никто так и не сказал.
Гы...
От: Merle Австрия http://rsdn.ru
Дата: 25.06.03 13:52
Оценка: 22 (2)
Может уже в этой гигантской ветке и попадалось, но вот:
http://unixsucks.com/
... [ RSDN@Home 1.1 alpha 1 ]
Мы уже победили, просто это еще не так заметно...
Re[53]: Windows vs Linyx
От: vvaizh http://izh-test.sourceforge.net/
Дата: 25.06.03 13:56
Оценка:
Здравствуйте, Ведмедь, Вы писали:

В>Здравствуйте, vvaizh, Вы писали:



V>>ага, и построишь на её основе выскокоточный взрыватель... Так и вижу компоненты выскоких технологий, а в качестве инициирующего

V>>эелемента — твоя лицензированная зажигалка, и механический палец для нажатия на кнопочку..

V>>Это то же самое, что использовать ворд дл япроверки орфографии в своей программе ..


В>Ты знаешь, есть проверка в Ворде, офис стоит. Я так понял ты в таком случае будешь искать где то ОТДЕЛЬНЫЙ компонент проверки. То есть у тебя будет стоять ДВА компонентя для одного и того же? Прекрасное решение!


Я вот в курсе, что оффис при установке поднимает целую толпу OLE-компонентов..
И скорее всего среди них есть тот, который нам нужен..
То, что вы вместо его поиска пользуете весь ворд, не есть хорошо..

В>Но лучше иметь зажигалку , чем каждый раз трением добывать огонь. Или связывать что то скочем, что бы не развалилось.



V>>Хотя наверно все не так смешно — а грустно, так как вся твоя система построена из таких деталек, так что зажигалка даже в глаза не бросается.. А там где деталек нет, у тебя пластилин... Супер...

V>>А потом МS выпускает новую версию своей "зажигалки" более прогрессивный, и ты свою конструкцию разбираешь снова, раздепляешь пластилин, ставишь новую зажигалку, тестируешь...

В>Какая у тебюя фантазия. ЗАчем? Ну вышла новая версия Ворда, меня то как она касается, все и так все работает давно. Если клиент хочет, то ставит новую версию ворда. и с НЕЙ ТОЖЕ БУДЕТ ВСЕ РАБОТАТЬ.


Если только они эту штуку не перепишут на .NET, а старый COM объект не выкинут за ненадобностью..
Или интерфейс сильно переделают..
И то и другое не кажется мне таким уж невероятным..

V>>А те, у кого нет твоих исходников, но которые уже успели купить твою прогу, курят..

V>>Или платят тебе за ановую версию

В>Ты знаешь, когда что то ставят заказчику, то должно все работать, и никакой заказчик не будет разбираться в твоих исходных кодах, они ему не нужны. Ему нужен рабочий продукт. причем быстро и качественно. И чем здесь могут помочь ему исходники я понять не могу. Только не надо сказок про "исправить и подправить". Этим должны заниматься разработчики. но ни как не заказчик.


Конечно, при сдаче они ему не нужны..
Вот только если ворда у него случайно стоять не будет, то придётся объяснять ему, что не так..
И прописывать ворд в ТЗ сразу.. И версию его тоже..

В>Знаешь когда заказывают новую версию? Нет? Почитай что-нибудь этому посвяшенное. Новую весрию заказывают тогда, когда не хватает старой и разработка ( покупка ) новой окупится. Это никак не связано с выходом новой версии Ворда. А вот скорость и модульность важна.

Ну как не связано то..
Поставят они себе новый ворд.. А орфография в вашей системе с ним и не подружится..
http://izh-test.sourceforge.net/russian/introduction.html
Re[52]: Windows vs Linyx
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.03 14:02
Оценка:
Здравствуйте, vvaizh, Вы писали:

PE>>Распространяется обычно бинарник и tlb в одном флаконе. все генерируется автоматом.

V>Да, автоматом — это круто..
V>Но — не нужно если этот самый *.h уже есть, как и все исходники..

Для какого языка ?


PE>>Если ты не используешь COM, как тебе получить заголовок и библиотеку для языка например Pascal ?

PE>>На сайте разработчика только для C/C++ есть. Что удешь делать ? Ничего. Искать другую.
V>Сгенерируй мне wrapper для паскаля..

В дельфях есть свой Midl. Юзай его.

V>И, кстати для какого ещё непонятно..

V>И потом для других языков конвертилок *.h-> в них тоже до фига..
V>Хотя я в принципе с тобой согласен, что idl баще конвертилок из *.h файла..
V>Но.. опять же в случае ispell, все wrapper-ы уже есть..

V>Хотя... наличие tlb-файла конечно шаг вперёд..

V>А idl формат он не OLE-шный, он общий (в CORBA такой же)..
V>Так что при необходимости, и на linux его вполно испльзуют..
V>А для ispell он не нужен опять же повторяю, потому, что
V>родных врапперов для всех языков навалом..

PE>>По этой причине ZLib распространяется с необходимыми файлами для ВСЕХ языков.

PE>>Для питона и перла она продублирована на 100%
PE>>Ты можешь дать гарантию, что тот, кто писал ZLib для питона,
PE>>не ошибся ни разу или совершил теже ошибки, что есть в варианте С/С++ ?
PE>>И не только ZLib.
V>ZLib — один на всех..
V>на языках только врапперы..
V>Или ты серъёзно думаешь, что кто то запускает такие долгоиграющие вещи, как сжатие данных на интерпретируемых языках..
V>Ты глубоко заблуждаешься..

Смотри ниже — один из файликов. Такое количесвто кода никому не надо. Где гарантии, что ошибок нет ?

PE>>В QT для Pascal чтобы не дублировать код, пришлось писать РУКАМИ врапперы, которые просто перенаправляют вызовы в QT для C/C++.

V>Ага... MFC вот тоже класса QT.. я что то не слышал, чтобы она на OLE была основана..
V>И вообще что она на паскале есть.. Хоть с врапперами, хоть без врапперов..

MFC — именно С++ билиотека для всего. А как писать для KDE на разных языках ?

PE>>В COM такого нет !

V>Дык и Попуоярной оконной библиотеки, основанной на COM нет..

Винда — это 75% COM.

V>>>Нет, тебе нужен 1 компонент, а во всех языках врапперы для него..

PE>>Значит 7 врапперов по твоему ?
V>А что, по твоему не 7?

V>>>Точто так же как и для OLE..

PE>>Какой враппер для OLE нужен ? Что это такое ? CComPtr ?
V>Не он сам, а то что у него в скобках <>
V>А сам он — тоже wrapper, но только не для spellchecker-а а для OLE..

CComPtr — враппер для указателя, а не для OLE.

PE>>COM — это враппер сам для себя ! IDL — это COM, а не враппер.

V>IDL — это международный стандарт..
V>Он и в CORBA используется..

PE>>>>или 1 компонента, которая свободно, без врапперов, подымается из любого языка.

V>>>Вот список врапперов, которые ты используешь:
V>>>1. "голый" OLE на С
PE>>Какой же это враппер ? Я вызываю функцию АПИ напрямую и получаю указатель на структуру из указателей.
PE>>Где врапперы ?
V>API чего? Ядра? Стандартной библиотеки C?
V>какая либа подключается? Вот эта либа и враппер..

В WINAPI есть фунцыя — CoCreateInstance

Сразу загружается оъект. Врапперы здесь нахрен не нужны.


V>>>2. библиотека на C++ для него

PE>>Что такое библиотека С++ для него ?
V>Представляющая для удобства "чистый" C-OLE в виде классов

Не надо такое. Есть интерфейсы и все.

V>Что там ты используешь..

V>MFC, ATL, что то другое?

Я тоьлко ATL для сервера. А как клиент мне это не надо.

V>>>3. заголовок, созданный из tlb-файла, или не знаю как ты его там создал..

PE>>Это генерируется по tlb и выглядит одинаково для всех библиотек во всех языках.
V>Кто? заголовок? А... Вспомнил..
V>Ты про слово import наверно..
V>А оно точно входит в стандарт C++?
V>Уж не говоря о том, чтобы idl входил в остав других языков..

PE>>Это не врапперы — это просто заголовки. Вот для Питона и Перла нужны врапперы. Они не умеют с COM работать.

V>Для C++ они тоже нужны.. это всё таки стандартизованный язык..
V>И MSVС имеет к нему отнрошение (по планам MS будет иметь, к не помню какому году.. только на 95%)

PE>>Враппер — COleDispatchDriver СPictureHolder COleStreamFile

PE>>Посмотри, пожалуйста, на эти врапперы и сравни с интерфейсами соответсвующими.
V>Я что то должен увидеть?
V>Ты пальцем покажи..
V>Я пока что вижу, что врапперы есть..
V>как должны они быть и для

Эти врапперы не нужны. Они лишь для твоего удобства.



Вот ез чего невозможно юзать ZLib в Питоне. Кода немеряно.


"Read and write ZIP files."
# Written by James C. Ahlstrom jim@interet.com
# All rights transferred to CNRI pursuant to the Python contribution agreement

import struct, os, time
import binascii

try:
    import zlib # We may need its compression method
except ImportError:
    zlib = None

__all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile",
           "ZipInfo", "ZipFile", "PyZipFile"]

class BadZipfile(Exception):
    pass
error = BadZipfile      # The exception raised by this module

# constants for Zip file compression methods
ZIP_STORED = 0
ZIP_DEFLATED = 8
# Other ZIP compression methods not supported

# Here are some struct module formats for reading headers
structEndArchive = "<4s4H2lH"     # 9 items, end of archive, 22 bytes
stringEndArchive = "PK\005\006"   # magic number for end of archive record
structCentralDir = "<4s4B4H3l5H2l"# 19 items, central directory, 46 bytes
stringCentralDir = "PK\001\002"   # magic number for central directory
structFileHeader = "<4s2B4H3l2H"  # 12 items, file header record, 30 bytes
stringFileHeader = "PK\003\004"   # magic number for file header

# indexes of entries in the central directory structure
_CD_SIGNATURE = 0
_CD_CREATE_VERSION = 1
_CD_CREATE_SYSTEM = 2
_CD_EXTRACT_VERSION = 3
_CD_EXTRACT_SYSTEM = 4                  # is this meaningful?
_CD_FLAG_BITS = 5
_CD_COMPRESS_TYPE = 6
_CD_TIME = 7
_CD_DATE = 8
_CD_CRC = 9
_CD_COMPRESSED_SIZE = 10
_CD_UNCOMPRESSED_SIZE = 11
_CD_FILENAME_LENGTH = 12
_CD_EXTRA_FIELD_LENGTH = 13
_CD_COMMENT_LENGTH = 14
_CD_DISK_NUMBER_START = 15
_CD_INTERNAL_FILE_ATTRIBUTES = 16
_CD_EXTERNAL_FILE_ATTRIBUTES = 17
_CD_LOCAL_HEADER_OFFSET = 18

# indexes of entries in the local file header structure
_FH_SIGNATURE = 0
_FH_EXTRACT_VERSION = 1
_FH_EXTRACT_SYSTEM = 2                  # is this meaningful?
_FH_GENERAL_PURPOSE_FLAG_BITS = 3
_FH_COMPRESSION_METHOD = 4
_FH_LAST_MOD_TIME = 5
_FH_LAST_MOD_DATE = 6
_FH_CRC = 7
_FH_COMPRESSED_SIZE = 8
_FH_UNCOMPRESSED_SIZE = 9
_FH_FILENAME_LENGTH = 10
_FH_EXTRA_FIELD_LENGTH = 11

# Used to compare file passed to ZipFile
import types
_STRING_TYPES = (types.StringType,)
if hasattr(types, "UnicodeType"):
    _STRING_TYPES = _STRING_TYPES + (types.UnicodeType,)


def is_zipfile(filename):
    """Quickly see if file is a ZIP file by checking the magic number.

    Will not accept a ZIP archive with an ending comment.
    """
    try:
        fpin = open(filename, "rb")
        fpin.seek(-22, 2)               # Seek to end-of-file record
        endrec = fpin.read()
        fpin.close()
        if endrec[0:4] == "PK\005\006" and endrec[-2:] == "\000\000":
            return 1    # file has correct magic number
    except IOError:
        pass


class ZipInfo:
    """Class with attributes describing each file in the ZIP archive."""

    def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)):
        self.filename = _normpath(filename) # Name of the file in the archive
        self.date_time = date_time      # year, month, day, hour, min, sec
        # Standard values:
        self.compress_type = ZIP_STORED # Type of compression for the file
        self.comment = ""               # Comment for each file
        self.extra = ""                 # ZIP extra data
        self.create_system = 0          # System which created ZIP archive
        self.create_version = 20        # Version which created ZIP archive
        self.extract_version = 20       # Version needed to extract archive
        self.reserved = 0               # Must be zero
        self.flag_bits = 0              # ZIP flag bits
        self.volume = 0                 # Volume number of file header
        self.internal_attr = 0          # Internal attributes
        self.external_attr = 0          # External file attributes
        # Other attributes are set by class ZipFile:
        # header_offset         Byte offset to the file header
        # file_offset           Byte offset to the start of the file data
        # CRC                   CRC-32 of the uncompressed file
        # compress_size         Size of the compressed file
        # file_size             Size of the uncompressed file

    def FileHeader(self):
        """Return the per-file header as a string."""
        dt = self.date_time
        dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
        dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
        if self.flag_bits & 0x08:
            # Set these to zero because we write them after the file data
            CRC = compress_size = file_size = 0
        else:
            CRC = self.CRC
            compress_size = self.compress_size
            file_size = self.file_size
        header = struct.pack(structFileHeader, stringFileHeader,
                 self.extract_version, self.reserved, self.flag_bits,
                 self.compress_type, dostime, dosdate, CRC,
                 compress_size, file_size,
                 len(self.filename), len(self.extra))
        return header + self.filename + self.extra


# This is used to ensure paths in generated ZIP files always use
# forward slashes as the directory separator, as required by the
# ZIP format specification.
if os.sep != "/":
    def _normpath(path):
        return path.replace(os.sep, "/")
else:
    def _normpath(path):
        return path


class ZipFile:
    """ Class with methods to open, read, write, close, list zip files.

    z = ZipFile(file, mode="r", compression=ZIP_STORED)

    file: Either the path to the file, or a file-like object.
          If it is a path, the file will be opened and closed by ZipFile.
    mode: The mode can be either read "r", write "w" or append "a".
    compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
    """

    fp = None                   # Set here since __del__ checks it

    def __init__(self, file, mode="r", compression=ZIP_STORED):
        """Open the ZIP file with mode read "r", write "w" or append "a"."""
        if compression == ZIP_STORED:
            pass
        elif compression == ZIP_DEFLATED:
            if not zlib:
                raise RuntimeError,\
                      "Compression requires the (missing) zlib module"
        else:
            raise RuntimeError, "That compression method is not supported"
        self.debug = 0  # Level of printing: 0 through 3
        self.NameToInfo = {}    # Find file info given name
        self.filelist = []      # List of ZipInfo instances for archive
        self.compression = compression  # Method of compression
        self.mode = key = mode[0]

        # Check if we were passed a file-like object
        if type(file) in _STRING_TYPES:
            self._filePassed = 0
            self.filename = file
            modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
            self.fp = open(file, modeDict[mode])
        else:
            self._filePassed = 1
            self.fp = file
            self.filename = getattr(file, 'name', None)

        if key == 'r':
            self._GetContents()
        elif key == 'w':
            pass
        elif key == 'a':
            fp = self.fp
            fp.seek(-22, 2)             # Seek to end-of-file record
            endrec = fp.read()
            if endrec[0:4] == stringEndArchive and \
                       endrec[-2:] == "\000\000":
                self._GetContents()     # file is a zip file
                # seek to start of directory and overwrite
                fp.seek(self.start_dir, 0)
            else:               # file is not a zip file, just append
                fp.seek(0, 2)
        else:
            if not self._filePassed:
                self.fp.close()
                self.fp = None
            raise RuntimeError, 'Mode must be "r", "w" or "a"'

    def _GetContents(self):
        """Read the directory, making sure we close the file if the format
        is bad."""
        try:
            self._RealGetContents()
        except BadZipfile:
            if not self._filePassed:
                self.fp.close()
                self.fp = None
            raise

    def _RealGetContents(self):
        """Read in the table of contents for the ZIP file."""
        fp = self.fp
        fp.seek(-22, 2)         # Start of end-of-archive record
        filesize = fp.tell() + 22       # Get file size
        endrec = fp.read(22)    # Archive must not end with a comment!
        if endrec[0:4] != stringEndArchive or endrec[-2:] != "\000\000":
            raise BadZipfile, "File is not a zip file, or ends with a comment"
        endrec = struct.unpack(structEndArchive, endrec)
        if self.debug > 1:
            print endrec
        size_cd = endrec[5]             # bytes in central directory
        offset_cd = endrec[6]   # offset of central directory
        x = filesize - 22 - size_cd
        # "concat" is zero, unless zip was concatenated to another file
        concat = x - offset_cd
        if self.debug > 2:
            print "given, inferred, offset", offset_cd, x, concat
        # self.start_dir:  Position of start of central directory
        self.start_dir = offset_cd + concat
        fp.seek(self.start_dir, 0)
        total = 0
        while total < size_cd:
            centdir = fp.read(46)
            total = total + 46
            if centdir[0:4] != stringCentralDir:
                raise BadZipfile, "Bad magic number for central directory"
            centdir = struct.unpack(structCentralDir, centdir)
            if self.debug > 2:
                print centdir
            filename = fp.read(centdir[_CD_FILENAME_LENGTH])
            # Create ZipInfo instance to store file information
            x = ZipInfo(filename)
            x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH])
            x.comment = fp.read(centdir[_CD_COMMENT_LENGTH])
            total = (total + centdir[_CD_FILENAME_LENGTH]
                     + centdir[_CD_EXTRA_FIELD_LENGTH]
                     + centdir[_CD_COMMENT_LENGTH])
            x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET] + concat
            # file_offset must be computed below...
            (x.create_version, x.create_system, x.extract_version, x.reserved,
                x.flag_bits, x.compress_type, t, d,
                x.CRC, x.compress_size, x.file_size) = centdir[1:12]
            x.volume, x.internal_attr, x.external_attr = centdir[15:18]
            # Convert date/time code to (year, month, day, hour, min, sec)
            x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F,
                                     t>>11, (t>>5)&0x3F, (t&0x1F) * 2 )
            self.filelist.append(x)
            self.NameToInfo[x.filename] = x
            if self.debug > 2:
                print "total", total
        for data in self.filelist:
            fp.seek(data.header_offset, 0)
            fheader = fp.read(30)
            if fheader[0:4] != stringFileHeader:
                raise BadZipfile, "Bad magic number for file header"
            fheader = struct.unpack(structFileHeader, fheader)
            # file_offset is computed here, since the extra field for
            # the central directory and for the local file header
            # refer to different fields, and they can have different
            # lengths
            data.file_offset = (data.header_offset + 30
                                + fheader[_FH_FILENAME_LENGTH]
                                + fheader[_FH_EXTRA_FIELD_LENGTH])
            fname = fp.read(fheader[_FH_FILENAME_LENGTH])
            if fname != data.filename:
                raise RuntimeError, \
                      'File name in directory "%s" and header "%s" differ.' % (
                          data.filename, fname)

    def namelist(self):
        """Return a list of file names in the archive."""
        l = []
        for data in self.filelist:
            l.append(data.filename)
        return l

    def infolist(self):
        """Return a list of class ZipInfo instances for files in the
        archive."""
        return self.filelist

    def printdir(self):
        """Print a table of contents for the zip file."""
        print "%-46s %19s %12s" % ("File Name", "Modified    ", "Size")
        for zinfo in self.filelist:
            date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time
            print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size)

    def testzip(self):
        """Read all the files and check the CRC."""
        for zinfo in self.filelist:
            try:
                self.read(zinfo.filename)       # Check CRC-32
            except:
                return zinfo.filename

    def getinfo(self, name):
        """Return the instance of ZipInfo given 'name'."""
        return self.NameToInfo[name]

    def read(self, name):
        """Return file bytes (as a string) for name."""
        if self.mode not in ("r", "a"):
            raise RuntimeError, 'read() requires mode "r" or "a"'
        if not self.fp:
            raise RuntimeError, \
                  "Attempt to read ZIP archive that was already closed"
        zinfo = self.getinfo(name)
        filepos = self.fp.tell()
        self.fp.seek(zinfo.file_offset, 0)
        bytes = self.fp.read(zinfo.compress_size)
        self.fp.seek(filepos, 0)
        if zinfo.compress_type == ZIP_STORED:
            pass
        elif zinfo.compress_type == ZIP_DEFLATED:
            if not zlib:
                raise RuntimeError, \
                      "De-compression requires the (missing) zlib module"
            # zlib compress/decompress code by Jeremy Hylton of CNRI
            dc = zlib.decompressobj(-15)
            bytes = dc.decompress(bytes)
            # need to feed in unused pad byte so that zlib won't choke
            ex = dc.decompress('Z') + dc.flush()
            if ex:
                bytes = bytes + ex
        else:
            raise BadZipfile, \
                  "Unsupported compression method %d for file %s" % \
            (zinfo.compress_type, name)
        crc = binascii.crc32(bytes)
        if crc != zinfo.CRC:
            raise BadZipfile, "Bad CRC-32 for file %s" % name
        return bytes

    def _writecheck(self, zinfo):
        """Check for errors before writing a file to the archive."""
        if self.NameToInfo.has_key(zinfo.filename):
            if self.debug:      # Warning for duplicate names
                print "Duplicate name:", zinfo.filename
        if self.mode not in ("w", "a"):
            raise RuntimeError, 'write() requires mode "w" or "a"'
        if not self.fp:
            raise RuntimeError, \
                  "Attempt to write ZIP archive that was already closed"
        if zinfo.compress_type == ZIP_DEFLATED and not zlib:
            raise RuntimeError, \
                  "Compression requires the (missing) zlib module"
        if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
            raise RuntimeError, \
                  "That compression method is not supported"

    def write(self, filename, arcname=None, compress_type=None):
        """Put the bytes from filename into the archive under the name
        arcname."""
        st = os.stat(filename)
        mtime = time.localtime(st[8])
        date_time = mtime[0:6]
        # Create ZipInfo instance to store file information
        if arcname is None:
            zinfo = ZipInfo(filename, date_time)
        else:
            zinfo = ZipInfo(arcname, date_time)
        zinfo.external_attr = st[0] << 16       # Unix attributes
        if compress_type is None:
            zinfo.compress_type = self.compression
        else:
            zinfo.compress_type = compress_type
        self._writecheck(zinfo)
        fp = open(filename, "rb")
        zinfo.flag_bits = 0x00
        zinfo.header_offset = self.fp.tell()    # Start of header bytes
        # Must overwrite CRC and sizes with correct data later
        zinfo.CRC = CRC = 0
        zinfo.compress_size = compress_size = 0
        zinfo.file_size = file_size = 0
        self.fp.write(zinfo.FileHeader())
        zinfo.file_offset = self.fp.tell()      # Start of file bytes
        if zinfo.compress_type == ZIP_DEFLATED:
            cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
                 zlib.DEFLATED, -15)
        else:
            cmpr = None
        while 1:
            buf = fp.read(1024 * 8)
            if not buf:
                break
            file_size = file_size + len(buf)
            CRC = binascii.crc32(buf, CRC)
            if cmpr:
                buf = cmpr.compress(buf)
                compress_size = compress_size + len(buf)
            self.fp.write(buf)
        fp.close()
        if cmpr:
            buf = cmpr.flush()
            compress_size = compress_size + len(buf)
            self.fp.write(buf)
            zinfo.compress_size = compress_size
        else:
            zinfo.compress_size = file_size
        zinfo.CRC = CRC
        zinfo.file_size = file_size
        # Seek backwards and write CRC and file sizes
        position = self.fp.tell()       # Preserve current position in file
        self.fp.seek(zinfo.header_offset + 14, 0)
        self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size,
              zinfo.file_size))
        self.fp.seek(position, 0)
        self.filelist.append(zinfo)
        self.NameToInfo[zinfo.filename] = zinfo

    def writestr(self, zinfo, bytes):
        """Write a file into the archive.  The contents is the string
        'bytes'."""
        self._writecheck(zinfo)
        zinfo.file_size = len(bytes)            # Uncompressed size
        zinfo.CRC = binascii.crc32(bytes)       # CRC-32 checksum
        if zinfo.compress_type == ZIP_DEFLATED:
            co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
                 zlib.DEFLATED, -15)
            bytes = co.compress(bytes) + co.flush()
            zinfo.compress_size = len(bytes)    # Compressed size
        else:
            zinfo.compress_size = zinfo.file_size
        zinfo.header_offset = self.fp.tell()    # Start of header bytes
        self.fp.write(zinfo.FileHeader())
        zinfo.file_offset = self.fp.tell()      # Start of file bytes
        self.fp.write(bytes)
        if zinfo.flag_bits & 0x08:
            # Write CRC and file sizes after the file data
            self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size,
                  zinfo.file_size))
        self.filelist.append(zinfo)
        self.NameToInfo[zinfo.filename] = zinfo

    def __del__(self):
        """Call the "close()" method in case the user forgot."""
        self.close()

    def close(self):
        """Close the file, and for mode "w" and "a" write the ending
        records."""
        if self.fp is None:
            return
        if self.mode in ("w", "a"):             # write ending records
            count = 0
            pos1 = self.fp.tell()
            for zinfo in self.filelist:         # write central directory
                count = count + 1
                dt = zinfo.date_time
                dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
                dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
                centdir = struct.pack(structCentralDir,
                  stringCentralDir, zinfo.create_version,
                  zinfo.create_system, zinfo.extract_version, zinfo.reserved,
                  zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
                  zinfo.CRC, zinfo.compress_size, zinfo.file_size,
                  len(zinfo.filename), len(zinfo.extra), len(zinfo.comment),
                  0, zinfo.internal_attr, zinfo.external_attr,
                  zinfo.header_offset)
                self.fp.write(centdir)
                self.fp.write(zinfo.filename)
                self.fp.write(zinfo.extra)
                self.fp.write(zinfo.comment)
            pos2 = self.fp.tell()
            # Write end-of-zip-archive record
            endrec = struct.pack(structEndArchive, stringEndArchive,
                     0, 0, count, count, pos2 - pos1, pos1, 0)
            self.fp.write(endrec)
            self.fp.flush()
        if not self._filePassed:
            self.fp.close()
        self.fp = None


class PyZipFile(ZipFile):
    """Class to create ZIP archives with Python library files and packages."""

    def writepy(self, pathname, basename = ""):
        """Add all files from "pathname" to the ZIP archive.

        If pathname is a package directory, search the directory and
        all package subdirectories recursively for all *.py and enter
        the modules into the archive.  If pathname is a plain
        directory, listdir *.py and enter all modules.  Else, pathname
        must be a Python *.py file and the module will be put into the
        archive.  Added modules are always module.pyo or module.pyc.
        This method will compile the module.py into module.pyc if
        necessary.
        """
        dir, name = os.path.split(pathname)
        if os.path.isdir(pathname):
            initname = os.path.join(pathname, "__init__.py")
            if os.path.isfile(initname):
                # This is a package directory, add it
                if basename:
                    basename = "%s/%s" % (basename, name)
                else:
                    basename = name
                if self.debug:
                    print "Adding package in", pathname, "as", basename
                fname, arcname = self._get_codename(initname[0:-3], basename)
                if self.debug:
                    print "Adding", arcname
                self.write(fname, arcname)
                dirlist = os.listdir(pathname)
                dirlist.remove("__init__.py")
                # Add all *.py files and package subdirectories
                for filename in dirlist:
                    path = os.path.join(pathname, filename)
                    root, ext = os.path.splitext(filename)
                    if os.path.isdir(path):
                        if os.path.isfile(os.path.join(path, "__init__.py")):
                            # This is a package directory, add it
                            self.writepy(path, basename)  # Recursive call
                    elif ext == ".py":
                        fname, arcname = self._get_codename(path[0:-3],
                                         basename)
                        if self.debug:
                            print "Adding", arcname
                        self.write(fname, arcname)
            else:
                # This is NOT a package directory, add its files at top level
                if self.debug:
                    print "Adding files from directory", pathname
                for filename in os.listdir(pathname):
                    path = os.path.join(pathname, filename)
                    root, ext = os.path.splitext(filename)
                    if ext == ".py":
                        fname, arcname = self._get_codename(path[0:-3],
                                         basename)
                        if self.debug:
                            print "Adding", arcname
                        self.write(fname, arcname)
        else:
            if pathname[-3:] != ".py":
                raise RuntimeError, \
                      'Files added with writepy() must end with ".py"'
            fname, arcname = self._get_codename(pathname[0:-3], basename)
            if self.debug:
                print "Adding file", arcname
            self.write(fname, arcname)

    def _get_codename(self, pathname, basename):
        """Return (filename, archivename) for the path.

        Given a module name path, return the correct file path and
        archive name, compiling if necessary.  For example, given
        /python/lib/string, return (/python/lib/string.pyc, string).
        """
        file_py  = pathname + ".py"
        file_pyc = pathname + ".pyc"
        file_pyo = pathname + ".pyo"
        if os.path.isfile(file_pyo) and \
                            os.stat(file_pyo)[8] >= os.stat(file_py)[8]:
            fname = file_pyo    # Use .pyo file
        elif not os.path.isfile(file_pyc) or \
             os.stat(file_pyc)[8] < os.stat(file_py)[8]:
            import py_compile
            if self.debug:
                print "Compiling", file_py
            py_compile.compile(file_py, file_pyc)
            fname = file_pyc
        else:
            fname = file_pyc
        archivename = os.path.split(fname)[1]
        if basename:
            archivename = "%s/%s" % (basename, archivename)
        return (fname, archivename)
Re[53]: Windows vs Linyx
От: vvaizh http://izh-test.sourceforge.net/
Дата: 25.06.03 14:07
Оценка:
Здравствуйте, Ведмедь, Вы писали:

V>>Кстати, вот ты знаешь даже я (я вообще не очень похожу на 80-летнюю тётку)

V>>не очень представляю себе, что ты имеешь ввиду под mmc, но знаю, что настройки
V>>администрирования винды раскиданы где попало.. и стройной системы я там что то не замечал..

В>- Ты суслика видишь

В>- Нет
В>- А он есть (с) ДМБ

В>То есть ты хочешь сказать то что я не видел, того не существует. Ты видел как админстряться IIS, MSSQL, BizTalk, COM+ ?

Не поверишь.. Я их даже администрировал..
И поверь, заколебался.. Уж больно "дубово" и "тормозно"..

В>Вот то в чем они администряться называется mmc.

В>И если надо ты с легкость можешь свою начинку вставить в mmc. И у тебя будет универсальный GUI интерфейс. Не надо будет изобретать

Мы обсуждаем потребности "старой тётки", если вы не забыли..
А для неё ваш анекдот как раз верен..
Я могу его даже дополнить..

— Загружаем ворд с диска..
— А диск где ?
— В компьютере..
— но я не видел, как вы туда его вставили, дискетница то пустая
— Но он там есть..
........

(Их услышанного)

Но, кроме того, непонятно, зачем то что вы перечислили на desctop-е..
http://izh-test.sourceforge.net/russian/introduction.html
Re[54]: Windows vs Linyx
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.03 14:15
Оценка:
Здравствуйте, vvaizh, Вы писали:

В>>То есть ты хочешь сказать то что я не видел, того не существует. Ты видел как админстряться IIS, MSSQL, BizTalk, COM+ ?

V>Не поверишь.. Я их даже администрировал..
V>И поверь, заколебался.. Уж больно "дубово" и "тормозно"..

Расскажи, какая связка (система/сервер)самая шустрая на
бд
до 100Gb
до 300Gb
до 1000Gb
до 3000Gb

И какой кластер дает больше всего транзакций.
Re[28]: Windows vs Linyx
От: Roman_M rgmroman.narod.ru
Дата: 25.06.03 14:17
Оценка: +1
Здравствуйте, mihailik, Вы писали:

R_M>>> А если _деньги_ будет получать кто-то другой, то M$ перекупит и будет продавать сам.

M>>Так это ж нормально. Все так поступают. Капитализм, однако.
R_M>> Суть в том, что не всем нравится такая политика M$.
M>Суть в том, что она никому не должна нравится. Мне тоже не нравится, что в магазине с меня деньги берут.

Очень странный поход к жизни, может сразу поехать в Африку, кушать бананы прямо с ветки.
Если рассматривать M$ как магазин, то выясниться, что они, как минимум, принуждают покупать товары внагрузку.
Re[57]: Windows vs Linyx
От: vvaizh http://izh-test.sourceforge.net/
Дата: 25.06.03 14:30
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Здравствуйте, vvaizh, Вы писали:


PE>>>Ага. И надо иметь либы для С, С++, Паскаля, Жавы, Питона, Перла, Руби и тд и тд — сколько языков, столько и либ ? Не многовато ли ?

V>>формат *.so он для всех языков один..
V>>как и формат *.dll в винде..
PE>Я не про это.
А я про это..


V>>Так что в перечисленных тобой фзыках

V>>нужно иметь только враппер, чтобы вызывать оттуда функции (из *.so),
V>>что давно уже сделано для всех перечисленных тобой языков (да я думаю и раньше OLE тоже..)..
PE>Естественно раньше. OLE-ActiveX-COM решают пролемы, возникающие в использовании ДЛЛ.
Дык в том то и дело, что в случае spellchecker-а никаких проблем до сих пор не возникло..

V>>Ну и чем это удобнее наименования библиотеки и функций в ней?

PE>1. Билиотека и так именуется. Только находиться может где угодно.
PE>2. Функция как таковая не существует. Есть объект и у него есть методы. ООП.
Ну в нашем случае вся библиотека — это один объект, и что? Это противоречит ООП?

PE>>>Если ты пишешь аппликацию, которая сможет работать с разными компонентами, то эти компоненты должны иметь одинаковый внешний программный интерфейс.

PE>>>Для этого есть средства соответсвующие.
V>>Как они компоненты идентифицировать будут?
V>>Как ты свой компонент идентифицировал?
PE>IUnknown везде и всюду одинаков !
И у него есть метод "проверить орфографию"?
Ты все равно по нему (ну или по IDispatch)
получишь интерфейс для работы с орфографией..
Вот этот самый интерфейс ты как идентифицировать будешь?

V>>Что ты мне всё "есть" да "есть"...

V>>Ты мне напиши, как ты "уже" сделал..
V>>А я посмотрю, удобнее это и проще, чем использование функций из библиотек или нет..

^^^^^^^^^^^^^^^^^
Нет ответа?

PE>У нас используется COM. Тебе должно ыть известны достоинства и недостатки COM по сравнению с ДЛЛ.


Я их перечисил выше..
Ты всё не помнишь..
Найди то место, и ткни меня, в достоинство, которое нужно для spellchecker-а..
Потому что я считаю, что этиз достоинств в случае spellchecker-а нет!

PE>>>>>Для COM это все не надо. Даже имени длл.

V>>>>А как же ты компонент проидентифицируешь?
PE>>>"Word.Application"
PE>>>"Excel.Application"
V>>Стоп..
V>>Вот ты перечислил 2 системы..
V>>Из твоей речи выше я так понял что есть 1!!!!!! компонент, который используется всеми остальными..
V>>Но ты почему то используешь не его, а что то другое (ворд)
V>>Этого компонента нет?
V>>Или он в ворде и ексель свой?
V>>Чего ты мне чепуху то городишь..
V>>Назови компонент, который используется в 10-ит системах, и который 1!
PE>MSXML, WebBrowser, MSHTML
Речь шла о spellchecker!
Для него дай.. 1 компонент!

V>>Я рад, жалко только что не твои плагины не всегда работают..

PE>>>Не нужно никаких врапперов.
V>>Ну и какой C++ класс у тебя создаётся?
V>>Тоже апишный?
PE>Я даже не знаю, класс ли это. АПИ возвращает указатель на интейфейс IUnknown.
В C++ нет понятия интерфейсов.. Как и в паскале..
Как и в perle и в куче других языков

V>>>>>>Для JS ?

V>>>>Аналогично
V>>>>CreateObject — это и есть wrapper OLE для JS..
PE>>>CreateObject — это враппер для АПИ функции CoCreateInstance и только.
PE>>>JS сам умеет работать с COM.
V>>JS — сам по себе большой враппер, а не язык, своих собственных средств у
V>>него очень мало, он как и vbs язык специально заточенный MS под COM..
V>>(по крайней мере то, что в Win называется JS..)
PE>В точку. Но это не враппер, а язык. Библиотека ему не нужна — она уже есть в самом Ворде, экселе и тд.
Ага, и shell не нужна..
shell же не поворачивается рука назвать "языком"
Или, и из него COM можно использовать?

PE>>>>>Я ком юзал из С и Asm. Врапперов нет. Дядя, не смеши. Ты COM — я уверен — не знаешь. Без обид.

V>>>>
V>>>>Я чувствую, что ты так думаешь..
V>>>>Жаль тебя разочаровывать, но пару/тройку ком компонентов я написал, а сколько
V>>>>использовал, вообще считать страшно..
PE>>>Я понимаю тебя. Я по большому счету ничего не писал, кроме COM компонентов и тд.
V>>А ну тогда всё понятно..
V>>Узкий специалист подобен флюсу — полнота его односторонняя
V>> (с) Козьма Прутков
V>>Тебе видимо просто не с чем сравнивать..
V>>Так что ты меня всё таки не понимаешь..
PE>Мне есть с чем сравнивать. ДЛЛ — это уровень С. COM — это уровень С++, JS, ObjPascal и тд (ООП).
Ну нет в C++ никаких интерфейсов, сколько можно говорить..
А про уровень — это всё общие рассуждения..
Про то, где сказывается преимущества OOP тоже можно много говорить, и
я буду оспаривать мнение, что то как реализован spellchecker в word,
снаружи него OOP никакого преимущества не даёт..

V>>Вот тогда прокомментируй высказывание, что минимальный объём проги использующий чистый С — OLE — 2000

V>>строк.. В отличие от ispell, который можно использовать вызовом нескольких строчек..
V>>И уж тем более, в asm..
PE>Ну ты даешь. Что делает прога в 2000 строк ?
PE>Вот минимальная прога
PE>А чуть ниже я еще прожку подкинул

PE>
PE>#include <Windows.h>

PE>int main(int argc, char* argv[])
PE>{
PE>   CoInitialize(0);

   
PE>   CoUninitialize()
PE>}
PE>


А где здесь использование OLE?
Я его что то не вижу..
вы просто его проинициализировали, никак не использовали..
Ваша программа эквивалентна пустому main-у..

PE>>>OLE — это старое понятие. OLE были в основном в ДЛЛ. Сейчас это не так. Ты же не только спелчекеры используешь.

V>>Ну COM, какая разница.. Ты мне всё таки объясни, преимущества использования спеллчеккера через COM.
V>>Про то что попадает в описанные мною 4 пункта, не нужна, для таких компонентов преимущества я знаю.
PE>Использование спеллчекера не нужно делать чз COM если ты его сам пишешь.
PE>Но если мне нужно использовать готовый, чтобы время с экономить ?
Я не оспариваю твоё решение, а лишь указываю, что отсутствие spellcheker-а в linux
в виде некого "компонента" ничуть не усложняет никому жизнь..

PE>Где мне скачать спелчекер для всех 7 языков ?

На linux он и есть для всех 7 языков..

PE>
.....
PE>


Посмотрел я код, и что то не нашёл, где ты в нём spellchecker вызывашь..?
Зато вижу что ты используешь врапперы для работы с XML, которые определены у тебя в файле parser.h..
http://izh-test.sourceforge.net/russian/introduction.html
Re[41]: Windows vs Linyx
От: vvaizh http://izh-test.sourceforge.net/
Дата: 25.06.03 14:32
Оценка: 7 (1)
Здравствуйте, VladD2, Вы писали:
V>>Только MS и его поклонники страдают от того, что всё должно делаться "галочками"
V>>(и web-service тоже)
VD>Ты кстати, пробовал web-сервисы на студии делать? Попробуй. Тут конкуренты действительно отдыхают, все красиво, прозрачно и удобно.

Я и на других средах не пробовал..
http://izh-test.sourceforge.net/russian/introduction.html
Re[55]: Windows vs Linyx
От: vvaizh http://izh-test.sourceforge.net/
Дата: 25.06.03 14:37
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Здравствуйте, vvaizh, Вы писали:


V>>Чё то мы всё херню обсуждаем какую то..

V>>Давайте киньте мне код, который вы __уже__ написали, и посмотрим
PE>Я пишу то, что сам писал, окей ?
Да, конечно..

PE>OLE в чистом виде да еще на Си — это не часто увидишь.

Если я не ошибаюсь, выше вы писали, что работаете с OLE без всяких wrapper-ов..
Чистый OLE он на чистом C написан, всё остальное — wrapper-ы над ним..

PE>
..
PE>


Я имел в виду код, который делает проверку орфографии..
Или это писали не вы (честно говоря искать кто таким хвастался, в лом..)
http://izh-test.sourceforge.net/russian/introduction.html
Re[28]: Windows vs Linyx
От: Roman_M rgmroman.narod.ru
Дата: 25.06.03 14:37
Оценка: +1
Здравствуйте, mihailik, Вы писали:

M>>Да, в XP и 2003 сервер. Уже сколько — больше года выходит.


R_M>>У меня сейчас не стоит XP, я даже ставить его не хочу (пока) по некоторым причинам. Сервер 2003 я на рабочий комп тоже ставить не хочу — назвался сервером, так и работай на серверах. И уж тем более я не буду переходить XP ради нескольких консольных утилит, просто возникает вопрос: какого #$#@%%*#$@ раньше этими утилитами ОС не комплектовали, можно подумать, что консольный таск менеджер — новейшее достижение в области информационных технологий.


M>Возникает ответ: а какого #$#@%%*#$@ ты раньше про это в Микрософт не написал директиву? Ты ж у них главный архитектор, как только они не догадались с тобой посоветоваться


Вы немного ошиблись, я не главный архитектор в M$, я всего лишь скромный президент мира.

R_M>>>Сторонние тулзы есть, но вот от M$ нет.

M>>И сторонние есть, и свои. Впрочем, мне больше всего нравится tlist.exe, кажется из какого-то ResKit, он ещё чёрт знает когда сделан. В отличие от всех остальных, он красиво отображает дерево процессов (кто-то кстати, считал, что дерево процесов бывает только в Unix).
R_M>>tlist тоже что-то не обнаружился.
M>Он не входит в Windows, как я уже говорил. Просто удобная вещь, советую поискать на просторах.

Да уменя и так такие утилиты есть (pslist), да и сам написать смогу при необходимости, другое дело что подобные вещи желательно класть в стандартную поставку ОС.

R_M>>А вот на счет дерева могу сказать, что правильно, по крайней мере отчасти. В Linux есть четкое дерево, начинающиеся с процесса init. Когда один процесс теряет родителя, его родителем становиться init, есть даже функция getppid().

M>Ну да, по крайней мере ориентироваться проще. Да и для системных целей.

R_M>> В Windows это не так. Идентификатор процесса-родителя традиционно не используется, процесс родитель может просто завершиться, тогда этот идентификатор теряет смысл.

M>Ну и обходятся без дерева. Здесь свои заморочки, свой монастырь.

Я не утверждаю, что это плохо.
Кластера
От: Сергей Глазунов Украина  
Дата: 25.06.03 14:48
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, kcp, Вы писали:


kcp>Речь первоначальна шла о том, что "винда уже три года лидер кластерных систем". Я и дал ссылочку, чтобы человек посмотрел на настоящие кластерные системы.


VD>Для русских танкисто был приведен самый известый бенчмарк.


Я в отличие от г-на Oleja не могу похвастаться опытом по созданию кластеров. Просто хотел разобраться, что дает Windows лидерство в этом сегменте(?), т.с. с точки зрения простого человека.
Вот мои суждения не в пользу Windows:
  1. кластерная задача — это расчет, вывод(здесь меня можете поправить) редко можно видеть на экране. Так вот, поскольку консольный режим в Windows отсутствует, Windows резервирует некоторое количество памяти под свои (GUI-компоненты) в памяти. Я не буду судить, много или мало они забирают ресурсов, но в случае отсутствия оных производительность не уменьшилась, а возросла бы.
  2. Я хочу сделать кластер на Windows|Linux. Ok. Просто, без никаких мониторовМышейКлавиатурПоддержкойUSB и другой мути. Зачем мне это? Потому, что я создаю целевую машину(ы) для своих расчетных задач, которые потребуют по возможности 100% загрузки CPU. Что мы делаем после покупки компьютеров. Правильно покупаем ОС- далее происходит чудо, оказывается в Windows ядро мы не можем сконфигурировать/оптимизировать под наши запросы в отличие от Linux ядра.
  3. Вот у меня есть задача, допустим поиск больших простых чисел. Как мне написать это на Windows и на Linux? Вот тут я нарочно умолчу суть проблемы. Подскажите механизмы, которые мне нужно использовать в Windows и Linux, и насколько они быстрые/ресурсоемкие.

Вобщем вопрос ко всей аудитории, а не только к Вам, Влад.
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Re: Кластера
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.03 15:03
Оценка:
Здравствуйте, Сергей Глазунов, Вы писали:

СГ>
  • Вот у меня есть задача, допустим поиск больших простых чисел. Как мне написать это на Windows и на Linux? Вот тут я нарочно умолчу суть проблемы. Подскажите механизмы, которые мне нужно использовать в Windows и Linux, и насколько они быстрые/ресурсоемкие.[/list]

    Короче тебе нужен суперкомпьютер. Это только Unix.

    Бизнес-кластеры — это совсем другое.
  • Re[56]: Windows vs Linyx
    От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
    Дата: 25.06.03 15:03
    Оценка:
    Здравствуйте, vvaizh, Вы писали:

    PE>>OLE в чистом виде да еще на Си — это не часто увидишь.

    V>Если я не ошибаюсь, выше вы писали, что работаете с OLE без всяких wrapper-ов..
    V>Чистый OLE он на чистом C написан, всё остальное — wrapper-ы над ним..

    PE>>
    V>..
    PE>>


    V>Я имел в виду код, который делает проверку орфографии..

    V>Или это писали не вы (честно говоря искать кто таким хвастался, в лом..)

    Эээ а разница то какая ?
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.