Ruguar MFC DLL и классы
От: TVagapov  
Дата: 01.07.03 06:10
Оценка:
Добрый день, уважаемые. Можно ли в 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++' — ПК
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.