Buildprocess для ActiveX / COM / проекты предприятия VB6

Ваш код немного запутан, и его не так просто понять, не посвящая много времени.

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

  export const sendChatNotification = functions.firestore
      .document('rooms/{roomId}/messages/{messageId}')
      .onCreate((snap, context) => {
        const roomId = context.params.roomId;
        const messageId = context.params.messageId;

        const newValue = snap.data();

        const receiverId = newValue.receiverId;
        const text = newValue.text;
        const type = newValue.type;
        const senderName = newValue.senderName;

        var p = admin
          .firestore()
          .collection('users')
          .doc(receiverId)
          .get();

        return p.then(snapshot2 => {  // <- HERE, the promise is returned
          const data2 = snapshot2.data();
          const firebaseNotificationToken = data2.firebaseNotificationToken;

          if (type == 'voiceCall' || type == 'videoCall' || type == 'hangUp') {
            const channelId = newValue.channelId;
            const senderId = newValue.senderId;
            const status = newValue.status;

            console.log('type: ' + type + ' /status: ' + status);

            let message = {
              data: {
                type: type,
                senderId: senderId,
                senderName: senderName,
                receiverId: receiverId,
                status: status,
                channelId: channelId,
                roomId: roomId
              },
              token: firebaseNotificationToken
            };

            return admin.messaging().send(message);  // <- HERE, the promise is returned
          }
        });

  }); 

Я бы посоветовал вам посмотреть 3 видео о «Обещаниях JavaScript» из серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/ [ 114]

5
задан Jan 8 October 2008 в 08:30
поделиться

3 ответа

Визуальная Сборка Pro. Если Вы все еще застреваете на земле VB6 и должны создать профессиональные продукты, я настоятельно рекомендую, чтобы Вы изучили этот продукт. Это имеет бесплатную демонстрационную версию и стоит каждого пенса (плюс он, делает довольно хорошее задание непрерывной интеграции для .NET и других платформ.) Это сохранило нас от ада DLL на каждом выпуске, так как мы начали использовать его. Нет никакого другого способа, которым я знаю о создать достойное поле сборки в VB6.

5
ответ дан 18 December 2019 в 08:32
поделиться

Как Mike Spross предполагает, необходимо использовать Совместимость на уровне двоичных кодов. Вы можете (и если) основываются на чистой машине. Вы делаете это путем хранения копии текущих производственных двоичных файлов (ActiveX DLLs & OCXs) в "совместимом" каталоге в системе управления исходным кодом. Все проекты должны обратиться к этой копии при выборе Двоичного Comatibility. Например, поместите новые двоичные файлы в...\Release и совместимые двоичные файлы, живые в...\Compatible. Когда новая версия входит в производство, Вы копируете все от...\Release до...\Compatible. Таким образом Вы сохраняете совместимость, идущую от одного выпуска до следующего.

Когда в режиме Binary Compatibility, VB создаст новый IID, если Вы добавите новый метод к своему классу. Помните, что в COM интерфейс неизменен. При внесении малейшего изменения в интерфейс Вы создаете что-то новое. VB наблюдает это правило COM, но использует некоторый дым и зеркально отражает для предотвращения взламывающего более старого клиентского кода. Поскольку VB "знает", что новый интерфейс является 100%-м надмножеством старого интерфейса (это - то, что Совместимость на уровне двоичных кодов гарантирует), она может использовать "передачу интерфейса". Интерфейс, передающий просто, перенаправляет все ссылки от старого интерфейса до нового интерфейса. Без этого приема необходимо было бы создать новые версии (с различными именами и CLSIDs) любого компонента ActiveX, который Вы изменяете. Ад DLL превратился бы в DLL Armargeddon!

VB хранит всю информацию о передаче интерфейса в ресурсах Вашего компонента. При регистрации компонента, он пишет весь интерфейс IIDs в HKCR\Interface. Более старые интерфейсы будут иметь информацию о передаче в них. Только "реальный" интерфейс будет относиться к фактическому coclass.

4
ответ дан 18 December 2019 в 08:32
поделиться

Можно сказать VB6 снова использовать GUID (LIBID's CLSID IID и т.д.) путем изменения compatbility настроек проекта к от "Никакого Compatbility" к "Совместимости на уровне двоичных кодов". Можно найти эти настройки в соответствии с Проектом-> Ваши-свойства-проекта. Установка совместимости находится на вкладке Component окна Project Properties. Существует три варианта:

  • Никакая совместимость
  • Совместимость проекта
  • Совместимость на уровне двоичных кодов

Вот то, что MSDN заявляет о них:

Никакая совместимость


С этой установкой не осуществляется никакая совместимость. Visual Basic создает новые Интерфейсные идентификаторы и идентификаторы Класса каждый раз, когда Вы создаете или компилируете свой проект. Каждая созданная версия может только использоваться с приложениями, созданными для работы с той определенной сборкой компонента.

Совместимость проекта


С этой установкой можно сделать проект совместимым с определенным проектом компонента. В то время как новая информация о библиотеке типов сгенерирована, идентификатор библиотеки типов сохраняется так, чтобы тестовые проекты могли все еще обратиться к проекту компонента. Эта установка для поддержания совместимости во время тестирования. Поэтому, после того как компонент выпущен, он ведет себя то же как установка No Compatibility.

Совместимость на уровне двоичных кодов


При компиляции проекта Visual Basic только создает новый Класс и Интерфейсные идентификаторы при необходимости. Это сохраняет класс и интерфейс ID от предыдущей версии (версий) так, чтобы скомпилированное использование программ более ранней версии продолжило работать. При внесении изменения, которое приведет к несовместимой версии, Visual Basic предупредит Вас. Если Вы хотите поддержать совместимость с более старыми, выпущенными версиями компонента ActiveX, это - установка, необходимо использовать.

Это кажется, что Вы в настоящее время компилируете без Совместимости. Как в статье MSDN говорится, необходимо использовать Совместимость на уровне двоичных кодов для хранения более новых версий компонентов совместимыми с более старыми версиями. Можно сделать это теперь путем выполнения следующего:

  • Скомпилируйте каждый проект однажды без Совместимости

  • Сохраните эти "чистые" версии к папке, к которой люди, делающие сборки, могут легко получить доступ, такие как сетевой ресурс, или, поместить их в управление исходным кодом.

  • Возвратитесь и измените все проекты на "Совместимость на уровне двоичных кодов" и укажите на "Совместимый Файл" на соответствующую версию, что Вы просто экономили на сетевом/в управлении исходным кодом (не указывайте на совместимый файл на тот же путь, в который Вы компилируете проект. Совместимый файл должен быть отдельной копией исходного компонента, который не изменится. Это только существует так, чтобы VB мог скопировать идентификатор из того файла в Ваш проект при перекомпиляции его).

Каждый раз, когда Вы перекомпилировали свои проекты, они снова используют GUID от совместимых (исходных) версий компонентов.

Править: Как Joe упомянул в комментариях, также необходимо распознать, когда интерфейсы класса изменились (то есть, когда интерфейс изменяется достаточно, что можно дольше поддержать совместимость на уровне двоичных кодов с предыдущими версиями). Когда это происходит, Вы хотите сделать полный разрыв из предыдущих версий компонентов: перекомпилируйте новую "чистую" версию (т.е. без Совместимости) и использование что новая версия как Ваш совместимый файл в будущих сборках. Однако важно отметить, что необходимо только запустить снова, когда класс соединяет интерфейсом (свойства и методы) с изменением. На самом деле VB предупредит Вас, когда проект больше не будет совместим с предыдущей версией компонента.

Если Вы хотите жить на краю...


Где я работаю, мы не ухаживаем к использованию (ab) ни за Какой Совместимостью на большинстве наших проектов, даже при том, что это не действительно корректный способ сделать вещи (необходимо использовать Совместимость на уровне двоичных кодов). В нашей компании это была полученная лень, потому что у нас есть автоматизированный инструмент сборки, который компилирует все наши проекты для нас, и одна из основных функций инструмента, это, может автоматически восстановить поврежденные ссылки проекта между проектами. Так как инструмент сборки фиксирует это для нас, существует меньше стимула использовать Совместимость на уровне двоичных кодов.

Почему Совместимость на уровне двоичных кодов лучше (или... почему Вы не должны делать то, что мы делаем),


Несколько причин, почему Совместимость на уровне двоичных кодов обычно является лучшим выбором:

  • Microsoft заявляет так

  • Если все Ваши компоненты двоичные совместимый с предыдущими релизами Вашего программного обеспечения, можно легко перекомпилировать единственный компонент и перераспределить его клиентам. Это делает bugfixes/patches легче развернуться. Если Вы не используете Совместимости на своих проектах, необходимо будет перекомпилировать и перераспределить целое приложение каждый раз, когда маленький патч должен выйти, потому что более новые компоненты (вероятно), не будут работать с более старыми компонентами.

  • Вы вносите свой вклад для поддержки стандарта COM: В COM идентификатор класса и интерфейсный идентификатор, как предполагается, однозначно определяют класс или интерфейс. Если Ваши классы и/или интерфейсы не изменились между сборками, то нет никакой причины генерировать новый идентификатор для тех классов и интерфейсов (на самом деле, то тот же класс имел бы несколько идентификатором). Двоичный Compatiblity позволяет Вам поддерживать тот же идентификатор через сборки, что означает, что Вы - добропорядочный гражданин и следуете конвенциям COM.

  • Меньше шума Реестра. Если Вы всегда развернете новые компоненты на клиентах, которые не являются двоичные совместимый со старыми версиями, то каждая новая версия добавит новую информацию к реестру. Каждый новый идентификатор интерфейса и класса имеет к зарегистрированному, среди прочего. Если Вы сохраняете все Двоичным файлом Совместимый, то установщик только должен добавить ключи реестра в одном месте, начиная с Вашего идентификатора класса и взаимодействовать через интерфейс, идентификатор не изменится.

  • При представлении общедоступного API или компонента, который используют другие приложения сторонних производителей, Вы определенно захотите использовать Совместимость на уровне двоичных кодов так, чтобы Вы не повреждали внешнее программное обеспечение, которое зависит от Вашего кода.

10
ответ дан 18 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

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