• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Библиотека без регистрации в реестре на VS 2008

Автор KonstrSerg, 06.08.09, 20:19:46

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

KonstrSerg

Если кого интересует создание библиотеки на VS 2008 без регистрации в реестре, пишите. Помогу. :!:

KonstrSerg

Письма приходят, значит тема заинтересовала.
Я сейчас пишу библиотеку интеграции Компас с APPIUS:PDM, поэтому куски кода с именами переменных буду вставлять как есть.

Первое: создаем проект Win32 на Visual С++ PDMLib.dll
В диалоге выбираем Application type:DLL

В сформировавшийся файл добавляем следующий код:

#include "stdafx.h"
#include "resource.h"
#include "PDMLib.h"

using namespace System::Reflection;
using namespace System::IO;
using namespace System::Windows::Forms;

#pragma managed
void StartNet(unsigned int comm)
{
   //получаем текущую сборку
   Assembly^ assem = Assembly::GetExecutingAssembly();

               //получаем расположение текущей сборки
   String^ pathName=assem->Location;

                 //извлекаем путь к папке с библиотекой
                 //10-длина имени файл "PDMLib.dll"
                String^ path=pathName->Substring(0,pathName->Length-10);

                //Получаем полный путь к библиотеке на чистом Net
                String^ vbpath=path+"ClientLib.dll";
   
               //Проверим наличие файла
   if (File::Exists(vbpath)==false)
   {
      MessageBox::Show("Файл "+vbpath+" не найден!","Ошибка",MessageBoxButtons::OK,MessageBoxIcon::Error);
       return;
   }

    //загружаем библиотеку ClientLib.dll написанную на VB
    Assembly^ vbassem;
    vbassem=Assembly::LoadFrom(vbpath);

   
    if (vbassem)
    {
        // создадим экземпляр класса ClientLib.VBStart описанного в библиотеке ClientLib.dll
        Object^ VBClass = vbassem->CreateInstance("ClientLib.VBStart");
        if (VBClass)
        {
          //получим метод "Start" класса VBStart
          MethodInfo^ VBMethod = vbassem->GetType("ClientLib.VBStart")->GetMethod("Start");
        if (VBMethod)
        {
         
       try {
         //создадим массив для передачи номера команды в метод "Start" класса VBStart
               array<Object^>^ myArray =   gcnew array<Object^>(1){ comm };

          //запускаем VB
                VBMethod->Invoke(VBClass, myArray);
               
      }
      catch ( TargetInvocationException^ E ) {
         MessageBox::Show(E->InnerException->Message);
      }

           
        }
        }
    }
}





//-------------------------------------------------------------------------------
// Определить имя библиотеки
// ---
#pragma unmanaged
extern "C" char * _stdcall LIBRARYNAME()
{
  return "PDM";
}


//-------------------------------------------------------------------------------
// Головная функция библиотеки
// ---
#pragma unmanaged
extern "C" void _stdcall LIBRARYENTRY( unsigned int comm )
{
StartNet(comm);
}


//-------------------------------------------------------------------------------
// Получить идентификаторы инструментальных и компактных панелей
// ---
#pragma unmanaged
extern "C" int _stdcall LibToolBarId( int barType, // Тип запрашиваемой панелей ( 0 - компактная панель, 1 - простая инструментальная панель )
                         int index )  // Индекс панели
{
   if ( !barType )
    return !index ? COMPACT_BAR1 : -1;
   else
      return -1;
}

//-------------------------------------------------------------------------------
// Задать идентификатор ресурсов
// ---
#pragma unmanaged
extern "C" unsigned int _stdcall LIBRARYID()
{
  return IDR_LIBID;
}

Второе:
К проекту добавляем файл PDMLib.def
LIBRARY   "PDMLib"
EXPORTS
LIBRARYENTRY
LIBRARYNAME
LIBRARYID
LibToolBarId

В настройках на вкладке General устанавливаем
Common Language Runtime Support (/clr)
На вкладке Framework and Refrences добавляем ссылки на
System, ClientLib.dll

Третье:
Создаем проект на VB ClientLib в этом же решении
Создаем следующий код

'Класс Отвечает за переход из С++ в VB
Public Class VBStart

    Public Sub Start(ByVal comm As UInt32)
        Select Case comm
                'Здесь вставляем свой код
            End Select

    End Sub

End Class

Для получения ссылок на Компас написал такой код
'Класс отвечает за операции с Компасом
Public Class CKompas

#Region "Propertys"

    'Указатель на Компас API версии 5
    Private Shared mKompas6API5 As Kompas6API5.KompasObject
    Friend Shared ReadOnly Property Kompas6API5() As Kompas6API5.KompasObject
        Get
            Try
                'Попробуем взять существующий экземпляр
                If mKompas6API5 Is Nothing Then
                    mKompas6API5 = CType(GetObject(, "Kompas.Application.5"), Kompas6API5.KompasObject)
                End If
                Return mKompas6API5

                'Возможно Компас не запущен
            Catch ex As Exception 'Это для внешних контроллеров
                'Попробуем запустить Компас
                Try
                    mKompas6API5 = CType(CreateObject("Kompas.Application.5"), Kompas6API5.KompasObject)
                    mKompas6API5.Visible = True
                    Return mKompas6API5
                    'Неудалось запустить Компас
                Catch ex1 As Exception
                 Return nothing
                End Try
            End Try
            Return mKompas6API5
        End Get
    End Property

    'Указатель на Компас API версии 7
    Private Shared mKompasAPI7 As KompasAPI7._Application
    Friend Shared ReadOnly Property KompasAPI7() As KompasAPI7._Application
        Get
            If mKompasAPI7 Is Nothing Then
                mKompasAPI7 = CType(Kompas6API5.ksGetApplication7, KompasAPI7._Application)
            End If
            Return mKompasAPI7
        End Get
    End Property

#End Region

End Class

Ну и последнее:
Команды и панели описываются в файлах ресурсов!

Alexey_Ovtses

Добрый день а можно выложить исходники, сам программирую на VB.net с с++ тяжело