关于dll封装的问题

olyouth1 2014-03-30 05:35:58
问题描述
1.使用dll封装一个已有的模块文件。在dll的接口文件中某个函数需要使用一个内部已经定义好的结构体类型(或类类型)的指针作为函数的参数。
2.问题1要求接口文件中包含dll内部的头文件。这样向dll的使用者提供dll时,除了需要提供dll、lib和dll接口头文件外,还需要额外的提供这个接口文件中包含的内部头文件,从而破坏了封装dll的初衷。
3.请问这种需要使用dll内部结构体作为dll对外接口的情况,通常应如何封装接口函数
谢谢
...全文
306 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
linyilong3 2014-04-05
  • 打赏
  • 举报
回复
引用 6 楼 olyouth 的回复:
[quote=引用 1 楼 linyilong3 的回复:] 写一层代理呗,你那个结构体里面肯定是一堆double ,int 的原始的C数据类型,假设你有A,B,C三个成员变量这个时候你就可以 int GetA(struct XXX *X); int GetB(struct XXX *X) 这样你DLL头文件只需要暴露你想要提供给别人的数据接口,C不会暴露出来
不是特别理解您的意思。看您提供的GetA和GetB的声明还是使用了内部的结构体struct XXX啊 还是需要在dll的接口头文件中包含内部的头文件啊?这样dll的使用者包含dll api时会提示找不到头文件,而编译失败?[/quote] 是的,他知道了你的声明,但是不知道你那里面有什么东西,具体的内存布局 如果你连声明都不想让人看到,你可以把那个改成void *类型的
linyilong3 2014-04-05
  • 打赏
  • 举报
回复
引用 10 楼 olyouth 的回复:
[quote=引用 9 楼 movsd 的回复:] 使用虚函数吧: A.h

class A
{
	public:
		virtual Release();
		virtual Fun1();
		virtual Fun2();
		Fun3();
		Fun4();
		...
	private:
		Fun10();
		Fun11();
		...
}

extern "C" __declspec (dllexport) A *CreateA();
A.cpp

Release()
{
	delete this;
}

Fun1()
{
	...
}

Fun2()
{
	...
}

Fun3()
{
	...
}

Fun4()
{
	...
}

...

Fun10()
{
	...
}

Fun11()
{
	...
}

...

A *CreateA()
{
	return new A;
}
提供给用户的头文件:

struct
{
	virtual Release();
	virtual Fun1();
	virtual Fun2();
};

extern "C" A *CreateA();
使用方式:

A *pA=CreateA();
pA->Fun1();
pA->Fun2();
pA->Release();
编译不能通过,error C2065: 'A' : undeclared identifier 提供给用户的头文件中并没有给出A的声明啊? 另外,这个语法从来没见过,能给解释一下吗? struct { virtual Release(); virtual Fun1(); virtual Fun2(); };[/quote] 提供DLL最好不要用虚函数
movsd 2014-04-02
  • 打赏
  • 举报
回复
引用 10 楼 olyouth 的回复:
编译不能通过,error C2065: 'A' : undeclared identifier 提供给用户的头文件中并没有给出A的声明啊? 另外,这个语法从来没见过,能给解释一下吗? struct { virtual Release(); virtual Fun1(); virtual Fun2(); };
是: struct A { virtual Release(); virtual Fun1(); virtual Fun2(); }; 写少了。
赵4老师 2014-04-02
  • 打赏
  • 举报
回复
都WTO了,一切地方保护主义终将灭绝。
olyouth1 2014-04-02
  • 打赏
  • 举报
回复
引用 9 楼 movsd 的回复:
使用虚函数吧: A.h

class A
{
	public:
		virtual Release();
		virtual Fun1();
		virtual Fun2();
		Fun3();
		Fun4();
		...
	private:
		Fun10();
		Fun11();
		...
}

extern "C" __declspec (dllexport) A *CreateA();
A.cpp

Release()
{
	delete this;
}

Fun1()
{
	...
}

Fun2()
{
	...
}

Fun3()
{
	...
}

Fun4()
{
	...
}

...

Fun10()
{
	...
}

Fun11()
{
	...
}

...

A *CreateA()
{
	return new A;
}
提供给用户的头文件:

struct
{
	virtual Release();
	virtual Fun1();
	virtual Fun2();
};

extern "C" A *CreateA();
使用方式:

A *pA=CreateA();
pA->Fun1();
pA->Fun2();
pA->Release();
编译不能通过,error C2065: 'A' : undeclared identifier 提供给用户的头文件中并没有给出A的声明啊? 另外,这个语法从来没见过,能给解释一下吗? struct { virtual Release(); virtual Fun1(); virtual Fun2(); };
movsd 2014-04-01
  • 打赏
  • 举报
回复
使用虚函数吧: A.h

class A
{
	public:
		virtual Release();
		virtual Fun1();
		virtual Fun2();
		Fun3();
		Fun4();
		...
	private:
		Fun10();
		Fun11();
		...
}

extern "C" __declspec (dllexport) A *CreateA();
A.cpp

Release()
{
	delete this;
}

Fun1()
{
	...
}

Fun2()
{
	...
}

Fun3()
{
	...
}

Fun4()
{
	...
}

...

Fun10()
{
	...
}

Fun11()
{
	...
}

...

A *CreateA()
{
	return new A;
}
提供给用户的头文件:

struct
{
	virtual Release();
	virtual Fun1();
	virtual Fun2();
};

extern "C" A *CreateA();
使用方式:

A *pA=CreateA();
pA->Fun1();
pA->Fun2();
pA->Release();
olyouth1 2014-04-01
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 olyouth 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中! 用API ReadProcessMemory还能读取正运行的其它进程的内存里面的所谓不想暴露的变量呢!
也不是为了加密而加密,主要意图是封装dll后,能够给使用者提供的只有一个dll和头文件,而不提供dll内部的头文件 呵呵,只是想要找到一种通用的处理方法。[/quote] 都开源时代了!代码不值钱,依托在代码之上的服务才值钱。 最好的API是直接提供源代码。[/quote] 了解,不费神了,直接拆结构体当参数算了,多谢
ningto.com 2014-03-31
  • 打赏
  • 举报
回复
别人要使用这个结构你肯定要告诉别人是什么,把这个结构单独拎出来吧。
赵4老师 2014-03-31
  • 打赏
  • 举报
回复
奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中! 用API ReadProcessMemory还能读取正运行的其它进程的内存里面的所谓不想暴露的变量呢!
赵4老师 2014-03-31
  • 打赏
  • 举报
回复
引用 5 楼 olyouth 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:] 奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中! 用API ReadProcessMemory还能读取正运行的其它进程的内存里面的所谓不想暴露的变量呢!
也不是为了加密而加密,主要意图是封装dll后,能够给使用者提供的只有一个dll和头文件,而不提供dll内部的头文件 呵呵,只是想要找到一种通用的处理方法。[/quote] 都开源时代了!代码不值钱,依托在代码之上的服务才值钱。 最好的API是直接提供源代码。
olyouth1 2014-03-31
  • 打赏
  • 举报
回复
引用 1 楼 linyilong3 的回复:
写一层代理呗,你那个结构体里面肯定是一堆double ,int 的原始的C数据类型,假设你有A,B,C三个成员变量这个时候你就可以 int GetA(struct XXX *X); int GetB(struct XXX *X) 这样你DLL头文件只需要暴露你想要提供给别人的数据接口,C不会暴露出来
不是特别理解您的意思。看您提供的GetA和GetB的声明还是使用了内部的结构体struct XXX啊 还是需要在dll的接口头文件中包含内部的头文件啊?这样dll的使用者包含dll api时会提示找不到头文件,而编译失败?
olyouth1 2014-03-31
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中! 用API ReadProcessMemory还能读取正运行的其它进程的内存里面的所谓不想暴露的变量呢!
也不是为了加密而加密,主要意图是封装dll后,能够给使用者提供的只有一个dll和头文件,而不提供dll内部的头文件 呵呵,只是想要找到一种通用的处理方法。
olyouth1 2014-03-31
  • 打赏
  • 举报
回复
引用 3 楼 tujiaw 的回复:
别人要使用这个结构你肯定要告诉别人是什么,把这个结构单独拎出来吧。
结构体拎出来的话不就重复定义了吗,编译不过去啊,要定义个别名吗?
linyilong3 2014-03-30
  • 打赏
  • 举报
回复
写一层代理呗,你那个结构体里面肯定是一堆double ,int 的原始的C数据类型,假设你有A,B,C三个成员变量这个时候你就可以 int GetA(struct XXX *X); int GetB(struct XXX *X) 这样你DLL头文件只需要暴露你想要提供给别人的数据接口,C不会暴露出来

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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