zoukankan      html  css  js  c++  java
  • 基于纯资源DLL 相关资料

    1. 以前都是先生成.rc 文件, 再生成.res文件,再建立VB6空白工程,文件菜单输出纯资源DLL文件.

    2. 度娘,谷哥:基于纯资源DLL多语言编程的实现 有中英文的实现。

    3. 还有用DOS写个脚本调用VC编译器的 当然前提是你电脑上安装了VC编译器,和手动建个工程一个意思。

    @ECHO OFF
    TITLE=创建资源DLL文件
    REM 源文件
    SET SRCFILE=resource.rc
    SET SCPP=RES.CPP
    SET SRESH=Resource.h
    
    REM 目标文件
    SET TRESFILE=resource.res
    SET TDLL=res.dll
    REM 临时OBJ文件
    SET TOBJ=RES.OBJ
    
    REM 临时路径
    SET OUTTMPPATH=TMP
    ECHO %~A1|FIND /I "D">NUL
    IF ERRORLEVEL 1 (
     REM 拖放的是文件,而不是文件夹 File
     GOTO ERROR
    )
    
    CALL :SETVC
    ECHO.
    ECHO.
    REM 文件版本号
    SET /P SVER=请输入DLL版本号(默认为:1.0.0.1):
    
    MORE +320 %~FS0>%TEMP%./CreateRCFile.js
    
    REM Folder
    CSCRIPT /nologo %TEMP%./createRCFile.js "%SVER%" "%~F1./%SRCFILE%"
    CD /D "%~FS1">NUL
    CD ..
    
    MOVE /Y "%~F1/%SRCFILE%" "%SRCFILE%""
    
    IF NOT EXIST "%OUTTMPPATH%" (
     MD %OUTTMPPATH%>NUL
    )
    ECHO 生成RES文件
    REM 生成Resource.h文件
    IF EXIST "%SRESH%" (
     DEL /Q "%SRESH%">NUL
    )
    FOR /F "DELIMS=@# TOKENS=*" %%I IN ('FINDSTR /B "@#" %~FS0') DO (
     ECHO %%I>>%SRESH%
    )
    REM 编译RC文件
    RC /fo%OUTTMPPATH%/%TRESFILE% %SRCFILE%
    IF ERRORLEVEL 1 GOTO ErrorMsg
    
    ECHO 生成OBJ文件
    IF EXIST "%SCPP%" (
     DEL /Q "%SCPP%">NUL
    )
    FOR /F "DELIMS=@@ TOKENS=*" %%I IN ('FINDSTR /B "@@" %~FS0') DO (
     ECHO %%I>>%SCPP%
    )
    
    CL /nologo /c %SCPP% /Fo%OUTTMPPATH%/%TOBJ%
    IF ERRORLEVEL 1 GOTO ErrorMsg
    
    ECHO 生成DLL文件
    LINK /nologo ./%OUTTMPPATH%/%TOBJ% ./%OUTTMPPATH%/%TRESFILE% /dll /machine:x86 /out:%TDLL%
    IF ERRORLEVEL 1 GOTO ErrorMsg
    
    
    ECHO.
    ECHO 所有步骤OK
    ECHO.
    CALL :Clean
    CALL :ShowAuthor
    
    PAUSE
    
    EXIT
    
    REM *******************************
    :Clean
    IF EXIST "%OUTTMPPATH%" RD /S /Q "%OUTTMPPATH%">NUL
    IF EXIST "%SCPP%" DEL /Q "%SCPP%">NUL
    IF EXIST "%SRCFILE%" DEL /Q "%SRCFILE%">NUL
    IF EXIST "Resource.h" DEL /Q "Resource.h">NUL
    GOTO :EOF
    
    REM *******************************
    :Error
    COLOR 0C
    ECHO.
    ECHO 使用方法:
    ECHO     将包含资源的文件夹拖放到%~NX0上即可。
    ECHO.
    ECHO.
    CALL :ShowAuthor
    PAUSE
    GOTO :EOF
    
    REM ******************************
    :ErrorMsg
    CALL :ShowAuthor
    SET /P AN=是否清除临时文件(默认清除Y/N)?
    IF /I "%AN%"=="y" CALL :Clean
    GOTO :EOF
    
     
    
    @@#include <windows.h>
    @@BOOL APIENTRY DllMain( HANDLE hModule, 
    @@                       DWORD  ul_reason_for_call, 
    @@                       LPVOID lpReserved
    @@                     )
    @@{
    @@    return TRUE;
    @@}
    
    
    @#//{{NO_DEPENDENCIES}}
    @#// Microsoft Developer Studio generated include file.
    @#// Used by NewRew.rc
    @#//
    @#// Next default values for new objects
    @#// 
    @##ifdef APSTUDIO_INVOKED
    @##ifndef APSTUDIO_READONLY_SYMBOLS
    @##define _APS_NEXT_RESOURCE_VALUE        101
    @##define _APS_NEXT_COMMAND_VALUE         40001
    @##define _APS_NEXT_CONTROL_VALUE         1000
    @##define _APS_NEXT_SYMED_VALUE           101
    @##endif
    @##endif
    
    ::*****************************************************************************
    :ShowAuthor
    
    ECHO.
    ECHO ----------------------------------------------------------------------
    ECHO * File name   : %~nx0 
    ECHO * Last Update : %~t0  
    ECHO * version     : 1.0                                  
    ECHO * Author      : Hongjun Ge                             
    ECHO * QQ          : 44173555                               
    ECHO * ICQ         : 162998098                              
    ECHO * EMail       : sdhongjun@163.com                                   
    ECHO ----------------------------------------------------------------------
    ECHO.
    GOTO :EOF
    
    
    REM 设置VC环境变量
    :SETVC
    SET INCLUDE=
    SET LIB=
    
    SET MSVCROOTKEY=HKLM/SOFTWARE/Microsoft/VisualStudio
    SET MSVC6KEY=%MSVCROOTKEY%/6.0/Setup/Microsoft Visual C++
    SET MSVC71KEY=%MSVCROOTKEY%/7.1/Setup/VC
    SET MSVC8KEY=%MSVCROOTKEY%/8.0/Setup/VC
    SET MSVC8EXPRESSKEY=HKLM/SOFTWARE/Microsoft/VCExpress/8.0/Setup/VC
    SET MSVC9KEY=%MSVCROOTKEY%/9.0/Setup/VC
    SET MSVC9EXPRESSKEY=HKLM/SOFTWARE/Microsoft/VCExpress/9.0/Setup/VC
    
    REM First see if we can find MSVC, then set the variable
    REM NOTE: delims=<tab><space>
    REM NOTE: run the initial REQ QUERY outside of the if() to set ERRORLEVEL correctly
    
    REG QUERY "%MSVC6KEY%" /v ProductDir >nul 2>nul
    if "%VC6DIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=2* delims=  " %%A IN ('REG QUERY "%MSVC6KEY%" /v ProductDir') DO SET VC6DIR=%%B
      )
    )
    
    REG QUERY "%MSVC71KEY%" /v ProductDir >nul 2>nul
    if "%VC71DIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=2* delims=  " %%A IN ('REG QUERY "%MSVC71KEY%" /v ProductDir') DO SET VC71DIR=%%B
      )
    )
    
    REG QUERY "%MSVC8KEY%" /v ProductDir >nul 2>nul
    if "%VC8DIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=2* delims=  " %%A IN ('REG QUERY "%MSVC8KEY%" /v ProductDir') DO SET VC8DIR=%%B
      )
    )
    
    REG QUERY "%MSVC8EXPRESSKEY%" /v ProductDir >nul 2>nul
    if "%VC8EXPRESSDIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=2* delims=  " %%A IN ('REG QUERY "%MSVC8EXPRESSKEY%" /v ProductDir') DO SET VC8EXPRESSDIR=%%B
      )
    )
    
    REG QUERY "%MSVC9KEY%" /v ProductDir >nul 2>nul
    if "%VC9DIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=2* delims=  " %%A IN ('REG QUERY "%MSVC9KEY%" /v ProductDir') DO SET VC9DIR=%%B
      )
    )
    
    REG QUERY "%MSVC9EXPRESSKEY%" /v ProductDir >nul 2>nul
    if "%VC9EXPRESSDIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=2* delims=  " %%A IN ('REG QUERY "%MSVC9EXPRESSKEY%" /v ProductDir') DO SET VC9EXPRESSDIR=%%B
      )
    )
    
    REM Look for Installed SDKs:
    SET SDKROOTKEY=HKLM/SOFTWARE/Microsoft/MicrosoftSDK/InstalledSDKs
    SET SDK2003SP1KEY=%SDKROOTKEY%/8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3
    SET SDK2003SP2KEY=%SDKROOTKEY%/D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1
    SET SDK6KEY=HKLM/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v6.0/WinSDKBuild
    
    REM Just a base value to compare against
    SET SDKVER=0
    SET SDKMINORVER=0
    
    REG QUERY "%SDK6KEY%" /v InstallationFolder >nul 2>nul
    if "%SDKDIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=2* usebackq delims=  " %%A IN (`REG QUERY "HKLM/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v6.0/WinSDKBuild" /v InstallationFolder`) DO SET SDKDIR=%%B
        SET SDKVER=6
      )
    )
    
    REG QUERY "%SDK2003SP2KEY%" /v "Install Dir" >nul 2>nul
    if "%PSDKDIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=3* delims=  " %%A IN ('REG QUERY "%SDK2003SP2KEY%" /v "Install Dir"') DO SET PSDKDIR=%%B
        REM arbitrary, but works for me
        SET PSDKVER=5
      )
    )
    
    REG QUERY "%SDK2003SP1KEY%" /v "Install Dir" >nul 2>nul
    if "%PSDKDIR%"=="" (
      IF %ERRORLEVEL% EQU 0 (
        FOR /F "tokens=3* delims=  " %%A IN ('REG QUERY "%SDK2003SP1KEY%" /v "Install Dir"') DO SET PSDKDIR=%%B
        SET PSDKVER=4
      )
    )
    
    ECHO Visual C++ 6 directory: %VC6DIR%
    ECHO Visual C++ 7.1 directory: %VC71DIR%
    ECHO Visual C++ 8 directory: %VC8DIR%
    ECHO Visual C++ 8 Express directory: %VC8EXPRESSDIR%
    ECHO Visual C++ 9 directory: %VC9DIR%
    ECHO Visual C++ 9 Express directory: %VC9EXPRESSDIR%
    if "%SDKDIR%"=="" (
        SET SDKDIR=%PSDKDIR%
        SET SDKVER=%PSDKVER%
    ) else (
        ECHO Windows SDK directory: %SDKDIR%
        ECHO Windows SDK version: %SDKVER%.%SDKMINORVER%
    )
    ECHO Platform SDK directory: %PSDKDIR%
    ECHO Platform SDK version: %PSDKVER%
    
    if "%VC9DIR%"=="" (
        if "%VC9EXPRESSDIR%"=="" (
      REM 尝试MSVC8.0
      if "%VC8DIR%"=="" (
       REM 尝试使用MSVC7.1
       if "%VC71DIR%"=="" (
        REM 尝试使用MSVC6.0
        if "%VC6DIR%"=="" (
         ECHO 未安装VC
        ) else (
         call "%VC6DIR%/Bin/vcvars32.bat"
        )
       ) else (
        call "%VC71DIR%/Bin/vcvars32.bat"
       )
      ) else (
       call "%VC8DIR%/Bin/vcvars32.bat"
      )
        )
    
        if "%SDKDIR%"=="" (
            ECHO "Microsoft Platform SDK was not found. Exiting."
            pause
            EXIT /B 1
        )
    
        rem Prepend MSVC paths
        call "%VC9EXPRESSDIR%/Bin/vcvars32.bat"
    
        rem Don't set SDK paths in this block, because blocks are early-evaluated.
    
        rem Fix problem with VC++Express Edition
        if "%SDKVER%"=="6" (
            rem SDK Ver.6.0 (Windows Vista SDK) and 6.1 (Windows Server 2008 SDK)
            rem does not contain ATL header files too.
            rem It is needed to use Platform SDK's ATL header files.
            SET USEPSDKATL=1
    
            rem SDK ver.6.0 does not contain OleAcc.idl
            rem It is needed to use Platform SDK's OleAcc.idl
            if "%SDKMINORVER%"=="0" (
                SET USEPSDKIDL=1
            )
        )
    ) else (
        rem Prepend MSVC paths
        call "%VC9DIR%/Bin/vcvars32.bat"
    )
    
    IF "%INCLUDE%"=="" (
     ECHO.
     ECHO 未安装VC环境
     ECHO。
     PAUSE
     EXIT
    )
    
    GOTO :EOF
    
    
    main();
    var fso;
    var sRootPath;
    var sRootName;
    var sRCName;
    
    //参数0: 输入的版本号
    //参数1: 输出RC文件
    function main()
    {
     try
     {
      var Args = WScript.Arguments;
            if (Args.length == 0)
         {
          WScript.Echo("未传入参数!");
           return;
         }
         
         if (Args.length != 2)
         {
             WScript.Echo("参数数量错误!");
             return;
         }
      
      var reVer  = /^/d{1,2}./d{1,2}./d{1,4}./d{1,4}$/gi; 
      var sVer = Args(0)
      if (!reVer.test(Args(0)))
      {  
       WScript.Echo("错误的版本号,使用默认版本号:1.0.0.1代替!");
       sVer = "1.0.0.1";
      } 
      
      var sRCPre = new String(getRCPre());
      sVer = sVer.replace(//./gi, ", ");
      sRCPre = sRCPre.replace(//$/gi, sVer);
      
      fso = new ActiveXObject("Scripting.FileSystemObject");
      var fRC = fso.CreateTextFile(Args(1), true, -1);
      sRCName = fso.GetFileName(Args(1));
      
      fRC.WriteLine(sRCPre);
      
      var rootFolder = fso.GetFolder(fso.GetParentFolderName(Args(1)));
      sRootPath = rootFolder + "//";
      sRootName = rootFolder.Name + "//";
      EnumAll(rootFolder, fRC, true);
      
      fRC.WriteLine(getRCSuf());
      
      //枚举文件
      fRC.close();
     
     } catch (e) {
      WScript.Echo("错误描述:" + e.description);
     }
    }
    
    function EnumAll(fo, fRC, bSearchSub)
    {
        try
        {
            var rootFolder;
    
            rootFolder = fso.GetFolder(fo);    
            
            var folderPath = rootFolder.Path;
            var folderName = rootFolder.Name;    
            
            //根目录中部分目录不枚举
            var parentFolderName = fso.GetParentFolderName(fo);
            if ((parentFolderName != "") && 
              (parentFolderName.charAt(parentFolderName.length-1) == "//"))
            {     
             var folderNameTmp = rootFolder.Name;
             if ((folderNameTmp == "RECYCLER") ||
                 (folderNameTmp == "Recycled") ||
                 (folderNameTmp == "System Volume Information")) return;
            }
            
            WScript.Echo("当前目录:" + fo);
    
            var fc = new Enumerator(rootFolder.files);    
            for (; !fc.atEnd(); fc.moveNext())
            {
       if (fc.item().Name == sRCName) continue;
                WScript.Echo("文件:" + fc.item().Name);
       
                var file     = fc.item();
                var fileName = file.Name;
       var sFilePath = file.ParentFolder.Path + "////";
       sFilePath = sFilePath.replace(sRootPath, "");
       
       try
       {
                    fRC.WriteLine(fileName + "/t" + rootFolder.Name + "/t/"" + sRootName + sFilePath + fileName + "/"");
                }catch (e) {      
                 WScript.Echo("");
                    WScript.Echo("错误描述:" + e.description);
                }
            }
            WScript.Echo("");
            
      if (!bSearchSub) return;
            fc = new Enumerator(rootFolder.SubFolders);
            for (; !fc.atEnd(); fc.moveNext())
            {
                EnumAll(fc.item(), fRC, false);
            }         
        } catch (e) {      
         WScript.Echo("");
            WScript.Echo("错误描述:" + e.description);
        }
    }
    
    function getRCPre()
    {
     var sRet = new String("/
    //Microsoft Developer Studio generated resource script./r/n/
    ///r/n/
    #include /"resource.h/"/r/n/
    /r/n/
    #define APSTUDIO_READONLY_SYMBOLS/r/n/
    //////////////////////////////////////////////////////////////////////////////r/n/
    ///r/n/
    // Generated from the TEXTINCLUDE 2 resource./r/n/
    ///r/n/
    #include /"afxres.h/"/r/n/
    /r/n/
    //////////////////////////////////////////////////////////////////////////////r/n/
    #undef APSTUDIO_READONLY_SYMBOLS/r/n/
    /r/n/
    //////////////////////////////////////////////////////////////////////////////r/n/
    // Chinese (P.R.C.) resources/r/n/
    /r/n/
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)/r/n/
    #ifdef _WIN32/r/n/
    LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED/r/n/
    #pragma code_page(936)/r/n/
    #endif //_WIN32/r/n/
    /r/n/
    #ifdef APSTUDIO_INVOKED/r/n/
    //////////////////////////////////////////////////////////////////////////////r/n/
    ///r/n/
    // TEXTINCLUDE/r/n/
    ///r/n/
    /r/n/
    1 TEXTINCLUDE DISCARDABLE /r/n/
    BEGIN/r/n/
        /"resource.h//0/"/r/n/
    END/r/n/
    /r/n/
    2 TEXTINCLUDE DISCARDABLE /r/n/
    BEGIN/r/n/
        /"#include /"/"afxres.h/"/"//r//n/"/r/n/
        /"//0/"/r/n/
    END/r/n/
    /r/n/
    3 TEXTINCLUDE DISCARDABLE /r/n/
    BEGIN/r/n/
        /"#define _AFX_NO_SPLITTER_RESOURCES//r//n/"/r/n/
        /"#define _AFX_NO_OLE_RESOURCES//r//n/"/r/n/
        /"#define _AFX_NO_TRACKER_RESOURCES//r//n/"/r/n/
        /"#define _AFX_NO_PROPERTY_RESOURCES//r//n/"/r/n/
        /"//r//n/"/r/n/
        /"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)//r//n/"/r/n/
        /"#ifdef _WIN32//r//n/"/r/n/
        /"LANGUAGE 9, 1//r//n/"/r/n/
        /"#pragma code_page(1252)//r//n/"/r/n/
        /"#endif //_WIN32//r//n/"/r/n/
        /"#include /"/"afxres.rc/"/"         // Standard components//r//n/"/r/n/
        /"#endif//r//n/"/r/n/
        /"//0/"/r/n/
    END/r/n/
    /r/n/
    #endif    // APSTUDIO_INVOKED/r/n/
    /r/n/
    /r/n/
    #ifndef _MAC/r/n/
    //////////////////////////////////////////////////////////////////////////////r/n/
    ///r/n/
    // Version/r/n/
    ///r/n/
    /r/n/
    VS_VERSION_INFO VERSIONINFO/r/n/
     FILEVERSION $/r/n/
     PRODUCTVERSION $/r/n/
     FILEFLAGSMASK 0x3fL/r/n/
    #ifdef _DEBUG/r/n/
     FILEFLAGS 0x1L/r/n/
    #else/r/n/
     FILEFLAGS 0x0L/r/n/
    #endif/r/n/
     FILEOS 0x4L/r/n/
     FILETYPE 0x2L/r/n/
     FILESUBTYPE 0x0L/r/n/
    BEGIN/r/n/
        BLOCK /"StringFileInfo/"/r/n/
        BEGIN/r/n/
            BLOCK /"080404b0/"/r/n/
            BEGIN/r/n/
                VALUE /"Comments/", /"包含资源的动态库文件 制作:葛红军//0/"/r/n/
                VALUE /"CompanyName/", /"西安市春秋视讯技术有限责任公司//0/"/r/n/
                VALUE /"FileDescription/", /"资源动态库文件//0/"/r/n/
                VALUE /"FileVersion/", /"$//0/"/r/n/
                VALUE /"InternalName/", /"Resource DLL//0/"/r/n/
                VALUE /"LegalCopyright/", /"(C) 2009 西安市春秋视讯技术有限责任公司//0/"/r/n/
                VALUE /"LegalTrademarks/", /"XI'AN CHUN QIUOPTO-ELECTRONIC CO., LTD.//0/"/r/n/
                VALUE /"OriginalFilename/", /"Resource.DLL//0/"/r/n/
                VALUE /"PrivateBuild/", /"//0/"/r/n/
                VALUE /"ProductName/", /"ResourceDLL Dynamic Link Library//0/"/r/n/
                VALUE /"ProductVersion/", /"$//0/"/r/n/
                VALUE /"SpecialBuild/", /"//0/"/r/n/
            END/r/n/
        END/r/n/
        BLOCK /"VarFileInfo/"/r/n/
        BEGIN/r/n/
            VALUE /"Translation/", 0x804, 1200/r/n/
        END/r/n/
    END/r/n/
    /r/n/
    #endif    // !_MAC/r/n/
    ");
     return sRet;
    }
    
    function getRCSuf()
    {
     var sRet = new String("/
    #endif    // Chinese (P.R.C.) resources/r/n/
    //////////////////////////////////////////////////////////////////////////////r/n/
    /r/n/
    /r/n/
    /r/n/
    #ifndef APSTUDIO_INVOKED/r/n/
    //////////////////////////////////////////////////////////////////////////////r/n/
    ///r/n/
    // Generated from the TEXTINCLUDE 3 resource./r/n/
    ///r/n/
    #define _AFX_NO_SPLITTER_RESOURCES/r/n/
    #define _AFX_NO_OLE_RESOURCES/r/n/
    #define _AFX_NO_TRACKER_RESOURCES/r/n/
    #define _AFX_NO_PROPERTY_RESOURCES/r/n/
    /r/n/
    //////////////////////////////////////////////////////////////////////////////r/n/
    #endif    // not APSTUDIO_INVOKED /r/n/
     ");
     
     return sRet;
    }
    

      4. 手动建立工程的

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/logitechlike/p/2516645.html
Copyright © 2011-2022 走看看