Создание точки входа

Автор Bumsi, 24.04.07, 12:00:40

« предыдущая - следующая »

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

Bumsi

Подскажите мне , пожалуйста, как создать точку входа в библиотеку. Просто очень нужно писать программу в окне, отличном от точки входа. Пока родился только такой вариант, но он ест 70% загрузки процессора. Хотелось бы узнать, возможен ли другой с меньшим потреблением. C++ Builder 6 , Компас 8+.
//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#include "Unit1.h"
#pragma hdrstop
#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------

//Название библиотеки
extern "C" unsigned int far __export __pascal LibraryId()
{
   return 100;
}
//Входная точка библиотеки Компас
extern "C" void far __export __pascal  LibraryEntry( unsigned int Comm )
{
  Application->CreateForm(__classid(TForm1), &Form1);
  Form1->Show();
  while (Form1->Exit!=true) Application->ProcessMessages();
}

bmiho

Последний цикл не нужен, если сделать так:

extern "C" void __export __pascal LIBRARYENTRY( unsigned int )
{

HWND wKompas=GetHWindow();
Application->Handle=wKompas;

Form1 = new TForm1(Application);
Form1->Show();
}

Если очень не хочется выходить из точки входа в библиотеку можно использовать функцию SystemControlStart и SystemControlStop при закрытии Вашей формы. А если доступ к Компасу не нужен, то лучше использовать ShowModal()...

Bumsi

25.04.07, 16:28:56 #2 Последнее редактирование: 25.04.07, 17:45:24 от Bumsi
УРА! Разобрался!!!!!! Огромное спасибо!!! остался последний вопрос.. что точно нужно подключать.. какие .h ??? а то я подключил какие знал, но думаю что многие не нужны...... у меня подключено :
#ifndef _WINDOWS_
#include <windows.h>
#endif

#ifndef __LIBTOOL_H
#include "libtool.h"
#endif

#include <ldefin2d.h>
#include <stdio.h>
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)

#include <stdio.h>
#pragma argsused
#include <vcl.h>
#include <windows.h>
#pragma hdrstop

bmiho

Достаточно написать:

#include <vcl.h>
#include <windows.h>
#include "libtool.h" (прежде чем подключать этот файл нужно в менеджере проектов подключить kAPI2D5bc.lib и(или) kAPI3D5bc.lib )
#include "Unit1.h"

Остальное по необходимости....

Стражи включения типа:

#ifndef xxx
#include ....
#endif

можно в программе не писать, они должны быть в h-файлах....

panaramix

Здравствуйте.

Вопрос в продолжении темы. В дистрибутиве КОМПАС 10 библиотека KAPI2D5BC.LIB пустая (т.е. с нулевым размером). Кто сталкивался с этой проблемой? С чем это может быть связано? Как победить?

Mihonius

Приветствую! Пишу библиотеку на С++ под Компас и тут такое сообщение при подключении этой библиотеки снимок прилагается!
Вот код:  компилируется без ошибок!
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include <Formdlg.h>
#include <ldefin2d.h>
#pragma hdrstop

#ifdef __LIGHT_VERSION__
#include <Kl_TLB.h>
#else
#include <Ks_TLB.h>
#endif

//--------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//-----------------------------------------------

extern "C" IDispatch* far __export WINAPI CreateKompasObject();

KompasObject* pKompas = NULL;
//-----------------------------------------------

extern "C" char* __export __pascal LibraryName()
{
        return "################";
}
//-----------------------------------------------
extern "C" void far __export __pascal LibraryEntry( unsigned int )
{
Application->Handle = (HWND)pKompas->ksGetHWindow();
Form1 = new TForm1(Application);
pKompas->ksEnableTaskAccess(0);
Form1->ShowModal();
pKompas->ksEnableTaskAccess(1);
Application->Handle = 0;
}
//---------------------------------------------

Sabahs

19.03.13, 18:21:22 #6 Последнее редактирование: 19.03.13, 18:39:48 от Sabahs
А, что дальше?
Можете попробовать в Projects->Options->Compiler->Code Optimization -> None.
PS. По C++ не спец.

Mihonius

Спасибо! Пробовал причина явно не в этом. Самое обидное код взят из уроков Компас-мастер. Там описан обработчик для вывода окна. С обработчиком та же история. Как только его объявляешь в LibraryEntry и подключаешь библиотеку получаешь тоже страшное сообщение и выход в режим отладки. Код описан на стр.13 )))
Вышел из положения более простой формулировкой:
extern "C" void __export __pascal LIBRARYENTRY( unsigned int Comm)
{
Application->CreateForm(__classid(TForm1), &Form1);
Form1->ShowModal();
}
Так работает без ошибок, добавить проверку и думаю пойдет!