Quantum > "Не помню всплывал такой совет уже или нет..." Помнится в одном из топиков я и советовал использовать DLL для автоматизации создания документов в MS Excel\Word. Тут как раз и рулит подход "кто на что учился". Я вот мягко говоря "недолюбливаю" VBA, поэтому всю основную обработку возлагаю на DLL. У приверженцев и знатоков васика может быть противоположный подход - использовать DLL для вспомогательных целей. Например VarPtr это рантайм функция, импортируемая из msvbwm60.dll и представляющая собой пару строчек на ассемблере Код (Text): mov eax,[esp+4] ret 4 Поэтому ничего не стоит включить ее в свою простенькую dll. (Кстати если пошевелить мозгами, то наверное можно и в Win API найти простые функции, возвращающие переданное в них значение) > "Да и работает он по понятным причинам только в скомпилированном экзешнике" А вот эту фразу я не понял. "Такой подход" работает во время исполнения куска кода (функции) и тут не важно создан экзешник заранее или кусок скомпилирован на ходу JIT-компилером (стеки, хипы и указатели никто не отменял и отменять не собирается, по кр.мере для х86) PS: попробовал я на досуге "такой подход" в MS Word 97 и 200? - полет нормальный ) И выделение глобальных\локальных переменных и передача параметров самые обычные, т.е. например объявляя друг за другом Arr() и Long, можно по адресу второй переменной определить адрес предыдущей. PSS: SAFEARRAY я думаю тоже врядли кто в ближайшее время "отменит" - на нем "все" OLE сидит и в oleaut32.dll есть пара десятков функций SafeArrayXXX. mix_mix Ну ты батенька загнул Автору топика достаточно было просто со своим васиком разобраться и получить заветные 1.5 минуты на обработку 1Гб. А MMX\SSE тут вообще ни причем - читаем кусок из одного места и пишем в другое - винда со своим файловым кэшем и ленивой записью сама все прекрасно разруливает и никакое ручное укрупнение блоков чтения\записи практического выигрыша не дает
leo LockResource такое делает. Вы же сами указали на ошибку в variant. В скомпилированном экзешнике это поле в моих экспериментах не проверялось, а в JIT, наверное, проверяется всегда. Если учесть все тонкости, будет работать и в JIT.
Quantum > "LockResource такое делает" Действительно работает. Хотя по грозному описанию типа "Do not pass any value..." ни за что не догадаешься. Поэтому вроде как и нет полной уверенности, что это будет работать во всех версиях винды. Или это древний баг, бережно охраняемый из соображений совместимости ? > "Если учесть все тонкости" Я это и имел ввиду - полностью воспроизвести валидную структуру SAFEARRAY, включая до кучи "скрытый" параметр VarType = vbByte по смещению -4. Например, можно включить объявление массива в структуру: Код (Text): type XXX 'название по вкусу :)) Buf() as Byte 'по сути Long - указатель на DimsAndFlags ElemType as Long '= vbByte (VBVarType) DimsAndFlags as Long '= &H800001, 1 - размерность, 80h - наличие VarType по смещению (-4) ElemSize as Long '= 1 - размер элемента Locks as Long '= 0 - число блокировок lpMem as Long '= указатель на внеш.память ElemCount '= число эл-тов = размеру блока памяти в байтах LowIndex as Long '= 0 - начальный индекс массива end type Кстати во флагах можно попробовать добавить признаки STATIC и FIXEDSIZE - чтобы VB не пытался удалять массив в случае невызова Unbind PS: Расписывать Bind\Unbind ес-но лень Если любители васика проснутся, тогда еще можно будет порассуждать )
leo Совместивости на уровне исходников с Win16. Возможно, ещё и с Win32s. Тут уже статью писать можно
Hi! Сказали же - юзайте FreeBasic Кроме обычных для Бейсика элементов языка, в этом компиляторе реализован ряд возможностей, существенно расширяющих базовый синтаксис . Речь идет о поддержке указателей, о расширенном наборе встроенных типов, о пользовательских типах, о перегрузке функций, о поддержке инструкций на языке ассемблера (X86) и о многом другом, что делает FreeBASIC полноценным средством разработки программ. Приложения могут разрабатываться для 32-разрядных операционных систем: MS Windows, Linux и DOS. Компилятор FreeBASIC позволяет создавать бинарные файлы различных форматов: OBJ, LIB, DLL, а также EXE (например, консольные и GUI-приложения для Win32). Так, для создания статической или динамической библиотеки достаточно добавить лишь один ключ в командную строку компилятора: -lib или -dll. Все компоненты FreeBASIC (в том числе и сторонних разработчиков) являются свободными (то есть не предусматривают лицензионных сборов за их использование в коммерческих или некоммерческих целях), исключая только библиотеку GoRC для Win32. Ассемблер, компоновщик, архиватор и другие утилиты, входящие в инсталляционный пакет, взяты из GNU binutil programming tools. http://www.freebasic.net/ http://www.freebasic.net/forum/ А это так, для примера Код (Text): type sometype a as integer b as short bytefunc as function( ) as byte ptr strfunc as function( byval s as string ) as string end type type bar a as integer b as short c as byte func as function( ) as sometype ptr end type declare function foo ( ) as bar ptr '' string function print foo( )->func( )->strfunc( "abc" ) '' change value (kids, don't do that at home!) *foo( )->func( )->bytefunc( ) = 8 '' do nothing, skip result foo( )->func( )->bytefunc( ) .... итеде
Короче, маппинг не юзай ничего не выиграешь. Пользуй Read*, Write*, SetFilePointer, CloseHandle всё из kernel32 ессесно. Почитай примеры из МСДН и будет тебе обработка файла при помощи АПИ...