这是一公司的面试题学习之用下载研究,但水平低不太懂。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

解决方案 »

  1.   

    MFC有扩展DLL的工程,建一个就OK了
      

  2.   

    我的想法【类似com】:1.从IController派生一个类,把基类方法全实现;
                          2.dll_init中生产一个IController派生类
                          3.dll_init就是产生一个类指针,给主界面调用相关函数实现功能;扩展DLL?是题目制定?
      

  3.   

    个人感觉这个题目出的不错。最近在看com和atl,这道题算是撞枪口上了。
    虽然他不属于com(没有实现iunknown接口),但是同样是对接口的操作,即对一组函数指针的操作。兄弟,这道题目对于不了解com的人来说(如果仅对c++水平足够高的话也可以没学过com,因为有本书上说com是更好的c++,你懂的),确实不好做。如果了解com的话,这题太简单了,如果对c++有较深的理解的话,即便是不知道com。自己稍微思考下也可以解决的。
      

  4.   

    bool dll_init(IBox * p_in/*IN*/, IController ** p_out/*OUT*/)
    {
    *p_out=new Cx;
    return true;
    }
    class Cx : public IController  
    {
    public:
    Cx();
    virtual ~Cx();
    public:
     void draw(HWND wnd, RECT & rc) ;
     void on_btn_up_pressed() ;
     void on_btn_left_pressed() ;
     void on_btn_right_pressed() ;
     void on_btn_down_pressed() ;};
    void Cx::draw(HWND wnd, RECT & rc)
    {
    return;
    }
    void Cx::on_btn_up_pressed()
    {
    MessageBox(0,"up",0,0);
    }
    void Cx::on_btn_left_pressed()
    {
    MessageBox(0,"left",0,0);
    }
    void Cx::on_btn_right_pressed()
    {
    MessageBox(0,"right",0,0);
    }
    void Cx::on_btn_down_pressed()
    {
    MessageBox(0,"down",0,0);
    }
      

  5.   

    把题目给的DLL文件反编译一下不就行了