Как я заставляю файлы в своем собственном формате файла иметь его собственный динамический значок?

C99 N1256 стандартная черновик

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.5.3.4 Оператор sizeof :

3 При применении к операнду, который имеет структуру или тип объединения, результатом является общее количество байтов в таких объект, включая внутреннюю и конечную прокладку.

blockquote>

6.7.2.1 Спецификаторы структуры и объединения :

13 ... Там может быть неназванным дополнением внутри объекта структуры, но не в начале.

blockquote>

и:

15 В конце структуры может быть неназванное дополнение или объединение.

blockquote>

Новая функция члена C99 с гибким элементом массива (struct S {int is[];};) также может влиять на заполнение:

16 As в специальном случае последний элемент структуры с более чем одним именованным элементом может иметь неполный тип массива; это называется гибким элементом массива. В большинстве ситуаций гибкий элемент массива игнорируется. В частности, размер структуры выглядит так, как если бы гибкий элемент массива был пропущен, за исключением того, что он мог иметь более длинное дополнение, чем подразумевалось.

blockquote>

Приложение J Проблемы с переносимостью повторяет:

Следующие неуказаны: ...

  • Значение байтов заполнения при хранении значений в структурах или объединениях (6.2.6.1)
blockquote>

C ++ 11 Стандартная черновая версия N3337

http://www.open-std.org/jtc1/sc22/wg21/ docs / papers / 2012 / n3337.pdf

5.3.3 Размер :

2 При применении к классу результатом является количество байтов в объекте этого класса, включая любое дополнение, необходимое для размещения объектов этого типа в массиве.

blockquote>

9.2 Члены класса :

Указатель на объект структуры стандартного макета, соответствующим образом преобразованный с использованием reinterpret_cast, указывает на его начальный член (или если этот элемент является битовым полем, то t o единица, в которой он находится) и наоборот. [Примечание. Таким образом, в рамках объекта структуры стандартного макета может быть указано неназванное заполнение, но не в его начале, по мере необходимости, для достижения соответствующего выравнивания. - end note]

blockquote>

Я знаю достаточно C ++, чтобы понять примечание: -)

9
задан Epaga 23 September 2008 в 13:20
поделиться

9 ответов

Windows

То, в чем Вы нуждаетесь, является Обработчиком Значков, также известным как Обработчик Миниатюр. Вот пример, записанный как активное управление x.

Другой ресурс должен искать Обработчики Свойств, которые должны также указать Вам к последнему и самому большому способу обработки динамических метаданных правильно в окнах.

Это динамические решения - они не необходимы, если Вы просто хотите значок, связанный со всеми Вашими файлами - они только используются, когда Вы хотите, чтобы Windows Explorer отобразил значок на основе того, что находится в файле, не только расширении, и когда файл изменяется, значок обновляется для отражения изменений. Это не должно быть изображение самого файла, также, обработчик миниатюр может генерировать любое изображение на основе содержания файла.

Обработчик свойств обновляет другие метаданные, такие как песня или видео длина, таким образом, можно использовать все метаданные поддержки Windows Explorer.

Относительно поддержки MAC говорит эта страница, "Mac и операционные системы Windows имеют различные методы включения этого типа миниатюры, и в случае Mac OS, эта поддержка была непоследовательна от версии до версии, таким образом, это не преследовалось [за Adobe InDesign]".

OS X

Значки для MAC OSX определяются Базой данных Launch Services. Однако это относится к статическому файлу значка для всех файлов, обработанных зарегистрированным приложением (это не основано на расширении - каждому файлу присоединили метаданные, которые определяют приложение, которому это принадлежит, хотя расширения дают подсказки, когда метаданные не существуют, такие как получение файла от другой ОС или файловой системы),

Кажется, что функциональность динамического значка в OSX обеспечивается Средством поиска, но поиски не поднимают легких указателей в этом направлении. Так как Средство поиска продолжает изменяться со временем, я вижу, почему этого целевого показателя трудно достигнуть...

Gnome

Для Gnome Вы используете thumbnailer. (спасибо Dorward)

Это - чрезвычайно простая программа, которую Вы пишете, который имеет 3 параметра командной строки:

  • введите имя файла, файл, который Вы описываете с миниатюрой (или URI при принятии их вместо этого),
  • имя выходного файла, где необходимо записать PNG
  • размер, число, в пикселях, который описывает максимальный квадратный размер изображения, который необходимо произвести (128-> 128x128 или меньший)

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

KDE

Я немного не уверен, но существует несколько указателей, которые должны запустить Вас. Сначала то, что Konqueror является файловым менеджером и отображает значки - он поддерживает динамические значки для некоторых встроенных типов, но я не знаю, являются ли они hardcoded или плагинами, можно записать. Проверьте Встроенное Учебное руководство по Компонентам для начальной точки.

Существует новое (выход?) функция (или запланированная функция...) названный Плазмой, которая имеет много дел с функциональностью значка и значками. Проверьте этот announcment и это начальное внедрение.

Вы, возможно, должны вырыть в источник Konqueror и проверить, как они сделали это для текстовых файлов и других, уже реализованных.

- Adam

8
ответ дан 4 December 2019 в 13:51
поделиться

В Windows, в чем Вы нуждаетесь, должен реализовать Обработчик Значков. Я сделал это много лун назад, и это не трудно, пока Вы знаете основы COM.

См.: http://msdn.microsoft.com/en-us/library/bb776857 (по сравнению с 85) .aspx

2
ответ дан 4 December 2019 в 13:51
поделиться

Для Gnome Вы используете thumbnailer.

1
ответ дан 4 December 2019 в 13:51
поделиться

Это до операционной системы насколько я знаю, она будет основана на расширении файла.

0
ответ дан 4 December 2019 в 13:51
поделиться

поскольку WINDOWS пробует это:

http://www.easydesksoftware.com/news/news12.htm

0
ответ дан 4 December 2019 в 13:51
поделиться

Я думаю, "пользовательский собственный" значок может иметь только файлы PE в окнах. Любые значки для расширений файла хранятся в реестре окон.

Для спецификации файла PE можно посмотреть на Всесторонний Взгляд в Формат Портируемого исполняемого файла Win32 и Пиринг В PE: Тур по Формату Портируемого исполняемого файла Win32.

Как это работает в другой ОС, я не знаю:/.

0
ответ дан 4 December 2019 в 13:51
поделиться

Я не знаю о Linux, но для Windows можно запустить здесь: http://msdn.microsoft.com/en-us/library/bb774614.aspx

Править: Я думаю, что этот интерфейс для миниатюр, показанных в режиме просмотра миниатюр, не значках. Извините за трату Вашего времени.

0
ответ дан 4 December 2019 в 13:51
поделиться

Исполняемые файлы имеют значок в файле (потенциально несколько) как "ресурс".

Файлы данных берут значок на основе ассоциации файлов.

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

0
ответ дан 4 December 2019 в 13:51
поделиться

Mac OSX, начиная с версии 10.5…

… имеет два подхода:

  1. Ваш документ находится в стандартном формате пакета OSX и имеет статическое изображение Это можно сделать, создав подпапку QuickLook и поместив внутрь Thumbnail / Preview.png / tiff / jpg.

  2. Для всего остального требуется плагин генератора QuickLook, который можно хранить в / Library / QuickLook ~ / Library / QuickLook или внутри папок YourApp.app/Contents/Library/QuickLook.

Этот генератор используется для создания эскизов и превью QuickLook на лету. XCode предлагает шаблон для этого. Шаблон генерирует необходимые файлы ANSI C , которые необходимо реализовать. Если вы хотите написать код Object-C , вам необходимо переименовать GenerateThumbnailForURL. c и GeneratePreviewForURL. c в GenerateThumbnailForURL. m m GeneratePreviewForURL. m (и внимательно прочтите Apple Devel Docs; In your GenerateThumbnailForURL.c (this is partly out of my head - so no guarantee that it works out of the box ;) ):

#include <Cocoa/Cocoa.h>
#include <Foundation/Foundation.h>

OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize)
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  /* unzip the thumbnail and put it into an NSData object */
  // Create temporary path and writing handle for extraction
  NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingFormat: [NSString stringWithFormat: @"%.0f.%@" , [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"png"]];
  [[NSFileManager defaultManager] createFileAtPath: tmpPath contents: [NSData alloc] attributes:nil];
  NSFileHandle *writingHandle = [NSFileHandle fileHandleForWritingAtPath: tmpPath];


  // Use task to unzip - create command: /usr/bin/unzip -p <pathToFile> <fileToExtract>
  NSTask *unzipTask = [[NSTask alloc] init];
  [unzipTask setLaunchPath: @"/usr/bin/unzip"];

  // -p -> output to StandardOut, added File to extract, nil to terminate Array
  [unzipTask setArguments: [NSArray arrayWithObjects: @"-p", [(NSURL *) url path], @"Thumbnails/thumbnail.png", nil]];

  // redirect standardOut to writingHandle
  [unzipTask setStandardOutput: writingHandle];

  // Unzip - run task
  [unzipTask launch];
  [unzipTask waitUntilExit];

  // Read Image Data and remove File
  NSData *thumbnailData = [NSData dataWithContentsOfFile: tmpPath];
  [[NSFileManager defaultManager] removeFileAtPath: tmpPath handler:nil];


  if ( thumbnailData == nil || [thumbnailData length] == 0 ) {
     // Nothing Found. Don't care.
     [pool release];
     return noErr;
  }

  // That is the Size our image should have - create a dictionary too
  CGSize size = CGSizeMake(256, 256);
  NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
      [NSNumber numberWithInt:size.width],kQLPreviewPropertyWidthKey,
      [NSNumber numberWithInt:size.height],kQLPreviewPropertyHeightKey,
      nil];

  // Get CGContext for Thumbnail
  CGContextRef CGContext = QLThumbnailRequestCreateContext(thumbnail, size, TRUE, (CFDictionaryRef)properties);
  if(CGContext) {
     NSGraphicsContext* context = [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)CGContext flipped:size.width > size.height];
     if(context) {
        //These two lines of code are just good safe programming…
       [NSGraphicsContext saveGraphicsState];
       [NSGraphicsContext setCurrentContext:context];

       NSBitmapImageRep *thumbnailBitmap = [NSBitmapImageRep imageRepWithData:thumbnailData];
       [thumbnailBitmap draw];

       //This line sets the context back to what it was when we're done
       [NSGraphicsContext restoreGraphicsState];
    }

    // When we are done with our drawing code QLThumbnailRequestFlushContext() is called to flush the context
    QLThumbnailRequestFlushContext(thumbnail, CGContext);

    // Release the CGContext
    CFRelease(CGContext);
  }

  [pool release];
  return noErr;
}

Info.plist

You will have to modify your info.plist file too - when you open it up it has a lot of fields pre-set. Most of them are self-explaning (or will not have to be changed) but I had to add the following structure (copy paste should do - copy the text, go into the plist editor and just paste.):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
   <dict>
     <key>UTTypeConformsTo</key>
     <array>
       <string>com.pkware.zip-archive</string>
     </array>
     <key>UTTypeDescription</key>
     <string>i-net Crystal-Clear Report File</string>
     <key>UTTypeIconName</key>
     <string>generic</string>
     <key>UTTypeIdentifier</key>
     <string>com.company.product</string>
     <key>UTTypeReferenceURL</key>
     <string>http://your-url.com</string>
     <key>UTTypeTagSpecification</key>
     <dict>
       <key>public.filename-extension</key>
         <array>
           <string>$fileEXT$</string>
         </array>
     </dict>
  </dict>
</array>
</plist>

This will register your filetype $fileExt$ and tell the system that your filetype is a zipy format type. A nice refference, that I used here is the QuickLook IPA Plugin from googlecode

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

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