刚进公司没两天,这两天培训根据主程序写个DLL,功能大概是这样的,在主程序里面调用,然后弹出个界面,在界面里设置参数的值,然后主程序处理相应的参数,然后把得到的结果显示出来。我就学过C++,以及一些windows界面开发方面的知识,这确实是为难我啊!
没办法硬着头皮上吧...
公司的这款软件已经开发了7年,经过无数人的努力已经到了今天这个地步,可以说主程序是相当的复杂,前两天是大概了解了下这款软件的功能和界面,今天开始从代码剖析。
怎么写DLL公司自己有一个技术文档照着套可以写出来,但这没什么用,你就算套出来了里面什么也不懂,就不能做出改变,不能开发出新的功能,没法子必须一个一个文件的研究
写一个DLL真正有用的不到10个类,而且这些类都早已经编好了。
我现在的情况是:不知道如何下手,其他的就不谈了吧

解决方案 »

  1.   

    根据向导创建工程,像编写普通函数一样编写函数
    导出函数用可以用dllexport声明
    比如
    BOOL __declspec(dllexport) __stdcall func(void)
    {
     //
    }
      

  2.   

    楼主如果还没解决这个问题QQ联系我(316645339)下,我前2天也在学这个,用一个WORD文档,你可以按着这个步骤走一遍,在想想,其实也就能明白一个大概流程了.
      

  3.   

    木有快速的方法,dll跟平时编程没什么区别啊
      

  4.   

    typedef struct _iicparam
    {
    BOOL ReadWriteActive;
    BOOL AddressLeftShift;
    BOOL NackDontCare;
    int ReadLevel;
    int AckLevel;
    int AddressBitCount;
    int DataBitCount;
    int SdaNameIndex;
    int SclNameIndex;
    COLORREF clrStart;
    COLORREF clrData;
    COLORREF clrRead;
    COLORREF clrWrite;
    COLORREF clrAck;
    COLORREF clrEnd;
    TCHAR AddressName[50];
    TCHAR DataName[50];
    TCHAR BusName[50]; //reserve var
    COLORREF m_clrSpecBuscolor1;    //Address
    COLORREF m_clrSpecBuscolor2; //NAck
    COLORREF m_clrSpecBuscolor3; //Data Ack
    COLORREF m_clrSpecBuscolor4; //data NACK
    COLORREF m_clrSpecBuscolor5;    //REG ADDR
    COLORREF m_clrSpecBuscolor6;
    BOOL m_bSpecflag1;
    BOOL m_bSpecflag2;
    BOOL m_bSpecflag3;
    BOOL m_bSpecflag4;
    BOOL m_bSpecflag5;
    BOOL m_bSpecflag6;
    BOOL m_bSpecflag7;
    BOOL m_bSpecflag8;//REGADDR check
    unsigned int m_nSpecNumber1;
    unsigned int m_nSpecNumber2;
    unsigned int m_nSpecNumber3;
    unsigned int m_nSpecNumber4;
    unsigned int m_nSpecNumber5;
    unsigned int m_nSpecNumber6;
    unsigned int m_nSpecNumber7;
    unsigned int m_nSpecNumber8;//REGADDR bit
    double m_dSpaceNumber1;
    double m_dSpaceNumber2;
    double m_dSpaceNumber3;
    double m_dSpaceNumber4;
    double m_dSpaceNumber5;
    TCHAR m_cSpecName1[50];//REGADDR
    TCHAR m_cSpecName2[50];
    TCHAR m_cSpecName3[50];
    TCHAR m_cSpecName4[50];
    //-----timepage-----
    BOOL startuptimebool;
        BOOL thdstabool;
        float   thdstamin;
    float   thdstamax;
    BOOL thddatbool;
        float   thddatmin;
    float   thddatmax;
    BOOL tsustobool;
    float   tsustomin;
    float   tsustomax;
    BOOL tsudatbool;
        float   tsudatmin;
    float   tsudatmax;
    //-----CIICRuleCustizePage-----
    BOOL    m_ActiveRule;
    int     m_DATARule;
    int     m_SLAVEADDRRule;
    int     m_REGADDRRule;
    public:
    _iicparam();
    TCHAR* GetAddressName();
    bool SetAddressName(const TCHAR* pName);
    TCHAR* GetDataName();
    bool SetDataName(const TCHAR* pName);
    TCHAR* GetBusName();
    bool SetBusName(const TCHAR* pName);
    void SetDefaultValue();
    TCHAR* GetREGADDRName();
    bool SetREGADDRName(const TCHAR* pName);
    }IICPARAM;....这才其中一个结构体,这么多变量,每个变量的意思都要搞清楚typedef struct _DataBusModule  //Bus Data Module Interface
    {
      char *description; // description
      HWND hwndParent; // parent window (filled in by calling app)
      HINSTANCE hDllInstance; // instance handle to this DLL (filled in by calling app)  bool (*VidPid)(unsigned short vid,unsigned short pid);//The software will be connected with the hardware
      bool (*supportcheck)(struct _DataBusModule *this_mod,int nVersion);//Check the version whether to need the Register number
      void (*Config)(struct _DataBusModule *this_mod);  // configuration dialog (if needed)
      int (*Init)(struct _DataBusModule *this_mod, void* BPOP);     // 0 on success, creates window, etc (if needed)
      bool (*DoBus)(struct _DataBusModule *this_mod,void* pObject);
      void (*CleanBus)(struct _DataBusModule *this_mod); //Clear package displaying in the Bus 
      void (*Quit)(struct _DataBusModule *this_mod);    // called when unloading
      void (*SetParamBuf)(void *pbuf,int size);
      void* (*GetParamBuf)(int &size);
      void (*SetBusTriParamBuf)(void *pbuf,int size);
      void* (*GetBusTriParamBuf)(int &size);
      int (*GetUnitCount)();                               //get unit count
      void (*GetUnit)(int nIndex,int &nFlag,COLORREF &clr,char *name,unsigned int &bitcount);////get single unit
      bool (*CheckSerial)(char *sn);
      bool (*PlugEnableUse)();                            //Get the Right of using the module for users 
      int (*LeastSingalNum)();               //The necessary and Least signal number
      bool (*BusListUnitShow)(short nFlag);               //The appointed Flag characters serial will be displayed
      bool (*BusListUnitName)(short nFlag,char *name);    //The characters serial of Unit name
      bool (*BusListUnitClr)(short nFlag,COLORREF &clr);  //the below color of unit Name
      bool (*BusListPackStart)(short nFlag);   //The start flag of package 
      bool (*BusListPackEnd)(short nFlag);   //The end flag of package 
      bool (*BusListDesShow)();   //Whether to display the description
      bool (*BusListDesFlag)(short nFlag,char *name);   //The Flag of necessary description, such as: LABEL_DATANACK 
      int (*Reserve0)(void);                              //The default function as below 
      int (*Reserve1)(void);
      int (*Reserve2)(void);
      int (*Reserve3)(void);
      int (*Reserve4)(void);
      int (*Reserve5)(int value); 
      int (*Reserve6)(int value);
      int (*Reserve7)(int value);
      bool (*Reserve8)(void);
      bool (*Reserve9)(void);
      void* (*Reserve10)(void* pdata);
      void* (*Reserve11)(void* pdata);
      void* (*Reserve12)(void* pdata);
      void* (*Reserve13)(void* pdata);
      void* (*Reserve14)(void* pdata);
      void* userData; // user data, optional
    } DATABUSMODULE;
    这个结构体封装了这么多函数,这样用的好处难道是实例化之后就可以在结构体中调用函数名就可以调用这个函数了?
      

  5.   

    看来楼主烦的不是如何写出这个dll,而是如何快速弄明白之前代码的作用和结构。但这是没有捷径可以走的啊。先弄懂这个程序的运行流程,然后自己揣摩一下实现思路,对照变量、函数和类的命名去理解一下吧。