VC DLL面试题,怎么下手
VC DLL面试题,如何下手?
这是一公司的面试题学习之用下载研究,但水平低不太懂。C++ , VC++ 的书也看过好几大本了.一般的DLL应用知道 但下面这一行:
bool dll_init(IBox * p_in/*IN*/, IController ** p_out/*OUT*/);
内部怎么实现,跟界面按钮如何关联起来,实在搞不明白!请高手编写个简单的代码,每个按钮只响应一个提示也行,明白了思路后我自己再去仔细研究. (还请大家提供一些参考资料方便学习)
感谢!
测试题:
请编写一个dll,这个dll能与我们提供的exe(初试D.exe)工作,在exe的界面上绘制我们提供的图片test.jpg,并且,能够通过主界面的按钮上下左右的移动界面上的图片。
提示:下面是我们的示例程序运行的效果图,你写的Dll中不需要写上“这是示例程序”那几个红色的文字。
需要的借口在interface.h中有定义。
示例程序是用vs2003编写。
例子图片你可以转化为bmp后再使用。
图片一次移动距离自己定,示例程序用的是5。
注:请提供程序源代码
interface.h文件
#pragma once
interface IController
{
virtual void draw(HWND wnd, RECT & rc) PURE;
virtual void on_btn_up_pressed() PURE;
virtual void on_btn_left_pressed() PURE;
virtual void on_btn_right_pressed() PURE;
virtual void on_btn_down_pressed() PURE;
};
//IBox接口由我们提供的exe实现,在调用你导出函数时,把IBox指针传给你
//你需要实现IController
interface IBox
{
virtual HWND getWND() PURE;
virtual RECT getDrawRect() PURE;
};
//dll提供的导出函数原型
typedef bool (*dll_entry_type)(IBox * p_in/*IN*/, IController ** p_out/*OUT*/) ;
extern "C" __declspec(dllexport) bool dll_init(IBox * p_in/*IN*/, IController ** p_out/*OUT*/);
试题下载地址:www.tigou.net/downloads/cx.rar
------解决方案--------------------
IController就是一抽象类
随便写个类继承,继承IController,实现
void draw(HWND wnd, RECT & rc) ;//EXE需要绘图的时候会调用你的类中的draw函数
void on_btn_up_pressed() ;//按下向上按钮会调用DLL中的这个函数
....
void on_btn_left_pressed() PURE;
void on_btn_right_pressed() PURE;
void on_btn_down_pressed() PURE;
------解决方案--------------------
#include "StdAfx.h"
#include "Controller.h"
#include "resource.h"
extern HINSTANCE hInst;
Controller::Controller()
{
}
Controller::~Controller(void)
{
}
void Controller::draw(HWND wnd, RECT & rc)
{
HDC hDC = GetDC(wnd);
CRect rt;
rt.CopyRect(&rc);
rt.OffsetRect(0,0);
HDC hCompationDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hDC,rt.Width(),rt.Height());
HGDIOBJ hOldCompationDC = SelectObject(hCompationDC,hBitmap);
HBRUSH hBrush = CreateHatchBrush(HS_DIAGCROSS,COLORREF(0xC0C0C0));
FillRect(hCompationDC,&rc,hBrush);
HDC hBitmapDC = CreateCompatibleDC(hDC);
HBITMAP hOldBitmap =(HBITMAP) SelectObject(hBitmapDC,this->m_Bitmap);
BitBlt(hCompationDC,0,0,rt.Width(),rt.Height(),hBitmapDC,m_Size.cx,m_Size.cy,SRCCOPY);
SelectObject(hCompationDC,this->m_Bitmap);
SetTextColor(hCompationDC,COLORREF(0xFF));
SetBkMode(hCompationDC,1);
TextOut(hCompationDC,10,10,_T("这是示例程序"),6);
BitBlt(hDC,0,0,rt.Width(),rt.Height(),hCompationDC,0,0,SRCCOPY);
SelectObject(hCompationDC,hOldCompationDC);
DeleteDC(hCompationDC);
DeleteObject(hBitmap);
DeleteObject(hBrush);
SelectObject(hBitmapDC,hOldBitmap);
DeleteDC(hBitmapDC);
ReleaseDC(wnd,hDC);
这是一公司的面试题学习之用下载研究,但水平低不太懂。C++ , VC++ 的书也看过好几大本了.一般的DLL应用知道 但下面这一行:
bool dll_init(IBox * p_in/*IN*/, IController ** p_out/*OUT*/);
内部怎么实现,跟界面按钮如何关联起来,实在搞不明白!请高手编写个简单的代码,每个按钮只响应一个提示也行,明白了思路后我自己再去仔细研究. (还请大家提供一些参考资料方便学习)
感谢!
测试题:
请编写一个dll,这个dll能与我们提供的exe(初试D.exe)工作,在exe的界面上绘制我们提供的图片test.jpg,并且,能够通过主界面的按钮上下左右的移动界面上的图片。
提示:下面是我们的示例程序运行的效果图,你写的Dll中不需要写上“这是示例程序”那几个红色的文字。
需要的借口在interface.h中有定义。
示例程序是用vs2003编写。
例子图片你可以转化为bmp后再使用。
图片一次移动距离自己定,示例程序用的是5。
注:请提供程序源代码
interface.h文件
#pragma once
interface IController
{
virtual void draw(HWND wnd, RECT & rc) PURE;
virtual void on_btn_up_pressed() PURE;
virtual void on_btn_left_pressed() PURE;
virtual void on_btn_right_pressed() PURE;
virtual void on_btn_down_pressed() PURE;
};
//IBox接口由我们提供的exe实现,在调用你导出函数时,把IBox指针传给你
//你需要实现IController
interface IBox
{
virtual HWND getWND() PURE;
virtual RECT getDrawRect() PURE;
};
//dll提供的导出函数原型
typedef bool (*dll_entry_type)(IBox * p_in/*IN*/, IController ** p_out/*OUT*/) ;
extern "C" __declspec(dllexport) bool dll_init(IBox * p_in/*IN*/, IController ** p_out/*OUT*/);
试题下载地址:www.tigou.net/downloads/cx.rar
------解决方案--------------------
IController就是一抽象类
随便写个类继承,继承IController,实现
void draw(HWND wnd, RECT & rc) ;//EXE需要绘图的时候会调用你的类中的draw函数
void on_btn_up_pressed() ;//按下向上按钮会调用DLL中的这个函数
....
void on_btn_left_pressed() PURE;
void on_btn_right_pressed() PURE;
void on_btn_down_pressed() PURE;
------解决方案--------------------
#include "StdAfx.h"
#include "Controller.h"
#include "resource.h"
extern HINSTANCE hInst;
Controller::Controller()
{
}
Controller::~Controller(void)
{
}
void Controller::draw(HWND wnd, RECT & rc)
{
HDC hDC = GetDC(wnd);
CRect rt;
rt.CopyRect(&rc);
rt.OffsetRect(0,0);
HDC hCompationDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hDC,rt.Width(),rt.Height());
HGDIOBJ hOldCompationDC = SelectObject(hCompationDC,hBitmap);
HBRUSH hBrush = CreateHatchBrush(HS_DIAGCROSS,COLORREF(0xC0C0C0));
FillRect(hCompationDC,&rc,hBrush);
HDC hBitmapDC = CreateCompatibleDC(hDC);
HBITMAP hOldBitmap =(HBITMAP) SelectObject(hBitmapDC,this->m_Bitmap);
BitBlt(hCompationDC,0,0,rt.Width(),rt.Height(),hBitmapDC,m_Size.cx,m_Size.cy,SRCCOPY);
SelectObject(hCompationDC,this->m_Bitmap);
SetTextColor(hCompationDC,COLORREF(0xFF));
SetBkMode(hCompationDC,1);
TextOut(hCompationDC,10,10,_T("这是示例程序"),6);
BitBlt(hDC,0,0,rt.Width(),rt.Height(),hCompationDC,0,0,SRCCOPY);
SelectObject(hCompationDC,hOldCompationDC);
DeleteDC(hCompationDC);
DeleteObject(hBitmap);
DeleteObject(hBrush);
SelectObject(hBitmapDC,hOldBitmap);
DeleteDC(hBitmapDC);
ReleaseDC(wnd,hDC);