现有一个简单类,如何转成一个dll供别人使用?

songfen8432 2005-01-13 02:49:20
现有一个简单类如下:

h文件如下:
// exportclass.h

#ifndef _EXPORTCLASS_H
#define _EXPORTCLASS_H

#include <iostream>
using namespace std;

class CPrac
{
public:
CPrac() : m_lCount(0)
{
}

virtual ~CPrac()
{
}

void AddRef();

private:
unsigned long m_lCount;
};

#endif

cpp文件如下:
// exportclass.cpp

#include "exportclass.h"

void CPrac::AddRef()
{
m_lCount ++;
cout << "Ref Count = " << m_lCount << endl;
}


需要如何改动才能把这个类转成一个dll呢?
...全文
267 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kilnut 2005-01-27
  • 打赏
  • 举报
回复
该说的都让人说了
songfen8432 2005-01-25
  • 打赏
  • 举报
回复
liangyufei 2005-01-19
  • 打赏
  • 举报
回复
對,必須是虛函數才能被調用
songfen8432 2005-01-18
  • 打赏
  • 举报
回复
期待中
realsuperliu 2005-01-18
  • 打赏
  • 举报
回复
如果要导出整个类,并且只在VC中用的话很简单,在你的类声明头文件里加上__declspec(dllexport)就可以了。比如
class __declspec(dllexport) CPrac
{
...
}

生成dll以后要把头文件和dll一起发布,应用程序使用这个类的时候要把声明改成__declspec(dllimport),你可以自己定义一个宏来做这个。
oyljerry 2005-01-14
  • 打赏
  • 举报
回复
你只导出了GetpCLine,就只能调用它啊,其他函数也要导出
songfen8432 2005-01-14
  • 打赏
  • 举报
回复
确实是纯C++调C++,先程序如下:
//MyDLL.h

#include <string>
#include <iostream>

using namespace std;

class CLine
{
protected:
int m_iSum;
string m_cNum;

public:
CLine() : m_iSum(-1), m_cNum("")
{
}
CLine(int initSum, string initNum) : m_iSum(initSum), m_cNum(initNum)
{
}
CLine(const CLine&);
virtual ~CLine()
{
};

CLine& operator = (const CLine&);

int GetSum() const;
string GetNum() const;
void SetSum(int sum);
void SetNum(string num);
/** No descriptions */
virtual void Show() const;
static void Hide(int ia);
virtual void AddRef();

public:
static string m_sT;

};

extern "C" _declspec(dllexport) CLine* GetpCLine();



//MyDll.cpp
#include "StdAfx.h"
#include "MyDll.h"



CLine* GetpCLine()
{
static CLine line(100, "Daniel");
return &line;
}


CLine::CLine(const CLine& line)
{
m_cNum = line.GetNum();
m_iSum = line.GetSum();
}

int CLine::GetSum() const
{
return m_iSum;
}

string CLine::GetNum() const
{
return m_cNum;
}

void CLine::SetSum(int sum)
{
m_iSum = sum;
}

void CLine::SetNum(string num)
{
m_cNum = num;
}


/** No descriptions */
void CLine::Show() const
{
cout << "sum: " << GetSum() << endl;
cout << "num: " << GetNum() << endl;
}

CLine& CLine::operator = (const CLine& line)
{
if (this != &line)
{
m_iSum = line.GetSum();
SetNum(line.GetNum());
}

return *this;
}

// Initialization of static member
string CLine::m_sT = "s0";

void CLine::Hide(int ia)
{
cout << ia << endl;
}

void CLine::AddRef()
{
cout << "CLine::AddRef" << endl;

}



// client.cpp
// use dll

#include <iostream>
#include "Mydll.h"
#include "StdAfx.h"
using std::cout;

void main()
{
typedef void* (*pClass) (void);

HINSTANCE hDLL = LoadLibrary("Mydll.dll");

if (hDLL == NULL)
{
cout << "load library failed!" << endl;
return;
}

pClass pGetpCLine = (pClass)GetProcAddress(hDLL, "GetpCLine");
CLine* pLine = (CLine*)pGetpCLine();
// pLine->SetSum(1500);
// pLine->GetSum();
pLine->Show();

FreeLibrary(hDLL);
}

这个程序能够运行,也就是说确实加载了DLL,用能够调用其中的Show函数,但是很奇怪,把注释行去掉就编译通不过,LINK2001错误,不能调用SetSum,GetSum等函数。

各位大牛指点一下吧。


songfen8432 2005-01-14
  • 打赏
  • 举报
回复
是呀!我的想法和njnuywg(老鼠爱上猫)是一样的,原以为导出指针后,应当能够调用所有public成员函数,现在好像只能调用public virtual函数。
njnuywg 2005-01-14
  • 打赏
  • 举报
回复
说错了是static 对象的地址 ^__^
njnuywg 2005-01-14
  • 打赏
  • 举报
回复
楼上他导出的是一个类的地址,不是一个函数!!所以按道理应该能用的但是。。。。等待高手回答~~~~~~~~~~~~学习中~~``
njnuywg 2005-01-13
  • 打赏
  • 举报
回复
那你就放到vc中改造一下就行了嘛~~,你不会用纯c++去调用纯c++写的“dll”吧?
songfen8432 2005-01-13
  • 打赏
  • 举报
回复
小弟用的是纯C++,没有AFX_EXT_CLASS和CDocument的定义,该如何使用呢?
而且我想生成dll而不是lib呀。
nastar 2005-01-13
  • 打赏
  • 举报
回复
新建一个DLL项目,把你的类加进去,编译为DLL就行了
xuzheng318 2005-01-13
  • 打赏
  • 举报
回复
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
msdn
老夏Max 2005-01-13
  • 打赏
  • 举报
回复
MFC DLL就可以了,呵呵,使用AFX_EXT_CLASS。例如:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

然后提供头文件和Lib库就可以在别的程序中使用了!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧