我的dll使用的是,non-mfc dll,
采用的第三种方法生成类。为什么我把头文件,lib,dll引用到了当前目录下。为什么我的调用DLL会出错:提示
'Timer_Node' : 'struct' type redefinition
'CSd_Timer_Queue' : 'class' type redefinition
谁能告我,如解决,当以100分相送

解决方案 »

  1.   

    参考一下,这里没有引如lib库,直接调用dll
    {//这里用的是WNASPI32.DLL 里面的函数
    HINSTANCE hinstWNASPI32;
    hinstWNASPI32 = LoadLibrary( "WNASPI32" );
    if( !hinstWNASPI32 )
    {
    AfxMessageBox("Can Not Open WNASPI32!");
    }
    DWORD (*pfnGetASPI32SupportInfo)( void );
    DWORD (*pfnSendASPI32Command)( LPSRB );
    BOOL (*pfnGetASPI32Buffer)( PASPI32BUFF );
    BOOL (*pfnFreeASPI32Buffer)( PASPI32BUFF );
    BOOL (*pfnTranslateASPI32Address)( PDWORD, PDWORD );
    pfnGetASPI32SupportInfo = (unsigned long (__cdecl *)(void))GetProcAddress( hinstWNASPI32, "GetASPI32SupportInfo");
    pfnSendASPI32Command = (unsigned long (__cdecl *)(void*))GetProcAddress( hinstWNASPI32, "SendASPI32Command" );
    pfnGetASPI32Buffer = (int (__cdecl *)(struct tag_ASPI32BUFF *))GetProcAddress( hinstWNASPI32, "GetASPI32Buffer" );
    pfnFreeASPI32Buffer = (int (__cdecl *)(struct tag_ASPI32BUFF *))GetProcAddress( hinstWNASPI32, "FreeASPI32Buffer" );
    pfnTranslateASPI32Address =(int (__cdecl *)(unsigned long *,unsigned long *)) GetProcAddress( hinstWNASPI32,"TranslateASPI32Address"); BYTE byHaCount;
    BYTE byASPIStatus;
    DWORD dwSupportInfo;
    dwSupportInfo = pfnGetASPI32SupportInfo();
    byASPIStatus = HIBYTE(LOWORD(dwSupportInfo));
    byHaCount = LOBYTE(LOWORD(dwSupportInfo));
    if( byASPIStatus != SS_COMP && byASPIStatus != SS_NO_ADAPTERS )
    { // Handle ASPI error here. Usually this involves the display
    // of a dialog box with an informative message.
    AfxMessageBox("ERROR!"); }// DWORD dwMaxTransferBytes;
    SRB32_HAInquiry srbHAInquiry;
    memset( &srbHAInquiry, 0, sizeof(SRB32_HAInquiry) );
    srbHAInquiry.SRB_Cmd = SC_HA_INQUIRY;
    srbHAInquiry.SRB_HaId = 1;
    pfnSendASPI32Command( (LPSRB)&srbHAInquiry );
    if( srbHAInquiry.SRB_Status != SS_COMP )
    {
    // Error in HAInquiry. Most likely SS_INVALID_HA.
    return 0;
    }
    // dwMaxTransferBytes = srbHAInquiry.HA_MaxTargets; BYTE byHaId;
    BYTE byTarget;
    SRB32_GDEVBlock srbGDEVBlock;
    intPhisicalDiskNum = 0;
    for( byHaId = 0; byHaId <= intChannel; byHaId++ )
    {
    for( byTarget = 0; byTarget <=intDiskID; byTarget++ )
    {
    memset( &srbGDEVBlock, 0, sizeof(SRB32_GDEVBlock) );
    srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE;
    srbGDEVBlock.SRB_HaId = byHaId;
    srbGDEVBlock.SRB_Target = byTarget;
    pfnSendASPI32Command( (LPSRB)&srbGDEVBlock );
    if( srbGDEVBlock.SRB_Status != SS_COMP ) continue; if( srbGDEVBlock.SRB_DeviceType == DTYPE_DASD ) //DTYPE_DASD identify magnetic disk;
    {
    // A CD-ROM exists at HA/ID/LUN = byHaId/byTarget/0.
    // Do whatever you want with it from here!

    if ((byHaId == intChannel )&& (byTarget == intDiskID)) 
    {
    return 0;
    }
    intPhisicalDiskNum++; //tmp.Format("Find A Disk At %d:%d:0 !",byHaId,byTarget);
    //AfxMessageBox(tmp);
    }
    }
    } FreeLibrary(hinstWNASPI32);
    return 1;
    }
      

  2.   

    这是引用dll的 Sd_Timer_Queen.h ********************************************************************/
    #ifdef SD_TIMER_QUEUE_EXPORTS
    #define SD_TIMER_QUEUE_API __declspec(dllexport)
    #else
    #define SD_TIMER_QUEUE_API __declspec(dllimport)
    #endifSD_TIMER_QUEUE_API typedef struct Timer_Node  //链表的定时器节点
    {
    unsigned int  Nok;                        //定时器对应的关键帧序号
    UINT_PTR    Timer_k;                      //定时器的唯一id标志
    struct Timer_Node  * next;                //定时器指针,指向下一个节点
    }   Tmr_Node;// This class is exported from the Sd_Timer_Queue.dllclass SD_TIMER_QUEUE_API CSd_Timer_Queue {
    private:
    Tmr_Node  * pHead;                                //定时器链表头
    public:
    CSd_Timer_Queue(void);                           //构造函数
    virtual ~CSd_Timer_Queue();                       //析构函数
        };
    *****************************************************************
    这是使用dll的.h#include "Sd_Timer_Queue.h"
    class TestQueen  
    {
    private:
    CSd_Timer_Queue  * CSd_Timer_Queue1;
    public:
    TestQueen(CSd_Timer_Queue * CSd_Timer_Queue2);  //此函数会认为重复定义
    virtual ~TestQueen();
    void test1();};
      

  3.   

    好在的一张空头支票。你开贴只有20分,说是给100分?呵呵呵。好了,你这个问题是你的DLL的头文件引起的。
    在头文件中加上
    #ifndef __Sd_Timer_Queen_h__
    #define __Sd_Timer_Queen_h__
    //内容#endif