Классы в DLL
Вот как класс описывается в dll:
class AFX_EXT_CLASS ppc : public CButton
{
public:
ppc();
~ppc();
void Message(const char *str);
};
class AFX_EXT_CLASS testclass
{ public:
void Nate();
void Nate(int vpolete);
};
PPCDll.cpp
#include "stdafx.h"
#include <afxwin.h>
#include <afxdllx.h>
#include "PPCDll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
static AFX_EXTENSION_MODULE PPCDllDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("PPCDll.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(PPCDllDLL, hInstance))
return 0;
// Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result.
new CDynLinkLibrary(PPCDllDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("PPCDll.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(PPCDllDLL);
}
return 1; // ok
}
ppc::ppc()
{
}
ppc::~ppc()
{
}
void ppc::Message(const char *str)
{ MessageBoxA(0,str,"", MB_APPLMODAL|MB_ICONINFORMATION);
}
void testclass::Nate()
{ MessageBoxA(0,"Просто!","На те!", MB_APPLMODAL|MB_ICONINFORMATION);
}
void testclass::Nate(int vpolete)
{ MessageBoxA(0,"В полёте!","На те!", MB_APPLMODAL|MB_ICONINFORMATION);
}
а в приложении имеется экземпляр этого класса. Вызов этих сообщений происходит кореектно. Но функция Create (p.Create("Опа!",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,CRect(0,0,50,50),this, 6578) ; ) не срабатывает - программа вылетает. Попробовал засунуть самодельный класс матриц - всё работает прекрасно.
Каких сообщений? Вы собираетесь вообще унаследованные методы вызывать и деструктор виртуальным делать?
Т.е. не сообщения, а функции (Message). Вообще-то, Create я не переопределял. И вообще, я уже разобрался. Ошибка крылась в строке "Опа!" - надо было изменить Character Set в свойствах проекта. Сейчас всё работает, и плеер тоже.
2. на сколько я помню таких проблем с мфц не было у меня ни разу... у вас при запуске приложения кричит о не достающей либе мфцэшной, я вас правильно понял? попробуйте пересобрать приложение с параметрами статической линковки. если же у вас как бы кричит на нехватку самописной дллки, то ее не то что можно перетащить, ее нужно перетащить.
Про это я уже забыл - всё работает.
Когда я отдаю на тест другому человеку (без Visual Studio), то Windows 7 заявляет о неправильной параллельной конфигурации, а XP - о некорректной настройке (наверное, одно и то же, не уверен). Если Visual Studio там стоит, то всё работает. Статически приложение не компилируется (ошибка, мол, не может обновить *.exe.manifest). В папку с приложением я кидал все самописные dll и все библиотеки, что нашёл в system32, по названию похожие на MFC (там всякие mfc90u.dll и тому подобные).
как уже достали с этим тупняком.. из года в год, из форума в форум - одно и то же..
1
2
3
4