HitmaeN's profileGameDevErBlogListsNetwork Tools Help

Blog


    5/21/2007

    调用动态加载的DLL中的重载函数

    看书时发现书中没有这方面的讲解,于是自己动手试验了一下,不知道这样做是否“正点”,欢迎讨论。

    关于DLL最基本的知识就不提了,开门见山地讲吧!

    现有动态链接库DLL_Sample.dll

    DLL_Sample.h:
    #ifdef TEST_API
    #    define TEST_API _declspec(dllexport)
    #else

    #    define TEST_API _declspec(dllimport)
    #endif

    TEST_API 
    int fuc(int a);
    TEST_API 
    int fuc(int a, int
     b);
    TEST_API 
    int fuc(int a, int b, int c);

    DLL_Sample.cpp:
    #define TEST_API
    #include 
    "DLL_Sample.h"

    TEST_API 
    int fuc(int a)
    {
        
    return
     a;
    }

    TEST_API 
    int fuc(int a, int
     b)
    {
        
    return a +
     b;
    }

    TEST_API 
    int fuc(int a, int b, int
     c)
    {
        
    return a + b +
     c;
    }


    在动态调用dll之前,需要查看一下dll导出的函数名称。
    查看编译器的导出名称,可以用VS工具目录下的Dependency Walker,或者在控制台下使用命令:dumpbin  /exports  DLL_Sample.dll

    这里我用dumpbin命令得到下面的信息:

    1    0    00011348    ?fuc@@YAHH@Z
    2    1    00011352    ?
    fuc@@YAHHH@Z
    3    2    000111DB   ?fuc@@YAHHHH@Z


    可以看到,重载函数各个版本的名称是不同的,这是因为编译器重新编码了重载函数的名称。
    为了方便记忆和使用,我们需要指定重载函数的命名规则,由于导出函数名的唯一性,我们无法将重载函数指定成相同的名称,所以我们采用fuc1、fuc2、fuc3来标识fuc函数的不同版本。
    我们用模块定义文件(.def)来定义dll导出。

    DLL_Sample.def:
    LIBRARY    DLL_Sample
    EXPORTS
    fuc1
    =?
    fuc@@YAHH@Z
    fuc2
    =?
    fuc@@YAHHH@Z
    fuc3
    =?fuc@@YAHHHH@Z

    然后写动态调用的示例代码(这里调用了第二个版本的fuc函数):
        
    HINSTANCE hInst 
    = LoadLibrary("Dll_Sample.dll");
    typedef 
    int (*MyProc)(int a, int
     b);
    MyProc Fuc 
    = (MyProc)GetProcAddress(hInst, "fuc2"
    );

    if (!
    Fuc)
    {
        MessageBox (
    "Fuc2 is null!"
    );
        
    return
    ;
    }

    CString str;
    str.Format (
    "a + b = %d", Fuc(23
    ) );
    MessageBox(str);

    FreeLibrary (hInst);


    结果输出“a + b = 5”
     
    3/3/2007

    3D Math

  • A Simple Quaternion-based Camera
  • Matrix and Quaternion FAQ: lots of info on matrix transformations & quaternion rotations.
  • 2/26/2007

    VS 插件 VA

    今天在看OGRE代码的时候发现VS的智能感知不起作用了,很是影响学习代码。
    上网搜了一下,按照别人说的,删除了几个文件又重新打开,结果还是不行,然后知道有个叫Visual Assist(VA)的VS插件。试了一下,问题解决了,这个插件真的很好用,比VS自己的智能感知更智能更强大,是程序员的得力助手。
    虽然问题的原因没有找到,它的很多特性我还没依依弄清楚,但是不管怎样,又发现了一个得力工具,值得庆贺!
    3/9/2006

    注重实效的程序员之快速参考指南

    1. 关心你的技艺
    2. 思考!你的工作
    3. 提供各种选择,不要找蹩脚的借口
    4. 不要容忍破窗户
    5. 做变化的催化剂
    6. 记住大图景
    7. 使质量成为需求问题
    8. 定期为你的知识资产投资
    9. 批判地分析你读到的和听到的
    10. 你说什么和你怎么说同样重要
    11. 不要重复你自己
    12. 让复用变得容易
    13. 消除无关事务之间的影响
    14. 不存在最终决策
    15. 用拽光弹找到目标
    16. 为了学习而制作原型
    17. 靠近问题领域编程
    18. 估算,以避免发生意外
    19. 通过代码对进度表进行迭代
    20. 用纯文本保存知识
    21. 利用命令Shell的力量
    22. 用好一种编辑器
    23. 总是使用源码控制
    24. 要修正问题,而不是发出指责
    25. 调试时不要恐慌
    26. “Select”没有问题
    27. 不要假定,要证明
    28. 学习一种文本操纵语言
    29. 编写能编写代码的代码
    30. 你不可能写出完美的软件
    31. 通过合约进行设计
    32. 早崩溃
    33. 用断言避免不可能发生的事情
    34. 将异常用于异常的问题
    35. 要有始有终
    36. 使模块之间的耦合减至最少
    37. 要配置,不要集成
    38. 将抽象放进代码,细节放进元数据
    39. 分析工作流,以改善并发性
    40. 用服务进行设计
    41. 总是为并发进行设计
    42. 使视图与模型分离
    43. 用黑板协调工作流
    44. 不要靠巧合编程
    45. 估算你的算法的阶
    46. 测试你的估算
    47. 早重构,常重构
    48. 为测试而设计
    49. 测试你的软件,否则你的用户就得测试
    50. 不要使用你不理解的向导代码
    51. 不要搜集需求-挖掘他们
    52. 与用户一同工作,以像用户一样思考
    53. 抽象比细节活得更长久
    54. 使用项目词汇表
    55. 不要在盒子外面思考-要找到盒子
    56. 等你准备好了再开始
    57. 对有些事情“做”胜于“描述”
    58. 不要做形式方法的奴隶
    59. 昂贵的工具不一定能制作出更好的设计
    60. 围绕功能组织团队
    61. 不要使用手工流程
    62. 早测试,常测试,自动测试
    63. 要到通过全部测试,编码才算完成
    64. 通过“蓄意破坏”测试你的测试
    65. 测试状态覆盖,而不是代码覆盖
    66. 一个BUG只抓一次
    67. 英语就是一种编程语言
    68. 把文档建在里面,不要栓在外面
    69. 温和地超出用户的期望
    70. 在你的作品上签名