Добрый день, уважаемые. Можно ли в Regulr MFC DLL использовать классы, а экспортировать только одну функцию, пользующуюся этими классами? Я впервые столкнулся с dll, поэтому вопрос может оказаться элементарным.
Ситуация следующая, есть громадный проект, разработка длится несколько лет. Теперь потребовалось содать api драйвер для доступа реализованным функциям. Одна из задач — обеспечить доступ из Excel. Для этого я написал в Excel макрос — в модуле добавил единственную строку Declare Sub GetConf Lib "tetDll.dll"() (Где GetConf моя функция ). Затем поместил tstDll.dll в WINNT\System. Скажу сразу, что этот вызов работает. Но, судя по всему, из за неправильного написания DLL приложение падает, как только происходит попытка что-либо записать или считать из методов классов. К классам я обращаюсь при помощи глобально объявленного указателя на класс.
Вот пример кода:
Как правильно выполнить задачу? Ведь если использовать MFC Extention DLL, то она не будет работать в VB, а следовательно и в Excell? Неужели придётся убирать все классы и пользоваться только чистыми функциями?!
И ещё, в правильно ли использовать в DLL глобвльную переменную-указатель на объект или это плохой стиль?
_PNBBCODE_CODE:
//----tstDll.cpp
#include "stdafx.h"
#include "tstDll.h"
#include "Class1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CTstDllApp, CWinApp)
//{{AFX_MSG_MAP(CTstDllApp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CTstDllApp::CTstDllApp()
{}
CTstDllApp theApp;
CClass1* m_pCl1; // указатель для доступа к методам класса CClass1
extern "C" __declspec(dllexport) long GetConf(void)
{
MessageBox(NULL,"Start GetConf","Hi",MB_OK);
VERIFY(m_pCl1 = new CClass1); //Создаём указатель на объект класса
if (m_pCl1 = NULL)
{MessageBox(NULL,"Ошибка 1. Указатель на объект класса CClass1 не создан!","Ошибка",MB_OK);
return(1); // Выход из программы с ошибкой 1
}
m_pCl1->SetVar(22); //ВОТ ЗДЕСЬ БУДЕТ ВЫЛЕТ, причём в
//класс CClass1 зайдёт, но на опреации присваивания вылетит
int k = m_pCl1->GetVar(); // Тоже вылет — на при return ...
return(0); // Всё хорошо — выход
}
// Class1.cpp: implementation of the CClass1 class.
#include "stdafx.h"
#include "tstDll.h"
#include "Class1.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CClass1::CClass1()
{m_iVar = 0;}
CClass1::~CClass1()
{}
void CClass1::SetVar(int ivr)
{m_iVar = ivr;}
int CClass1::GetVar()
{return m_iVar;}
01.07.03 19:59: Перенесено модератором из 'C/C++' — ПК