骄傲の猫的专栏

管理一群程序员,就象放牧一群骄傲的猫。

用户操作
[即时聊天] [发私信] [加为好友]
顾建华ID:ShardowM
3196次访问,排名2万外好友2人,关注者5
编程
ShardowM的文章
原创 5 篇
翻译 0 篇
转载 1 篇
评论 5 篇
最近评论
sky04:刚好在找这个方面资料,谢谢了
henry:现在比较清楚你的意思是什么了。下面有一些讨论:

--“花费一定的时间来构建链表”是指内存池在分配到一块大的内存后,需要在这块内存中建立链表,链接链表中各个节点的关系。

这个时间只是在构建 pool 时一次花销的。比起大量反复分配/释放小物件内存的实际客户程序的实际应该不算什么。

-- 我说的很大困难是指创建一个通用的内存池。
<……
骄傲的猫:把allocate改成下面那个样子,应该更合理
void* Pool::allocate(size_t size)
{
if (size != _block)
return ::operator new(size);

//在被stackPtr堆栈中获得内存的地址
if (top > 0) ……
骄傲的猫:我说的很大困难是指创建一个通用的内存池。在Scott Meyers的Effective C++中介绍的内存池,是通过在被创建的对象中加一个Next指针使其指向下一个对象来建立链表的,这样的话内存池在给对象分配内存时必须通过Next指针来知道下一个对象的地址,因此内存池类就必须知道对象的类的接口,因此也无法将内存池类和对象的类独立出来。
“花费一定的时间来构建链表”是指内存池在分配到一……
henry:-- 但是正是由于链表,给创建一个可通用的内存池类带来了很大的困难,而且在程序必须花费一定的时间来构建链表。

这句话很费解。操作链表很容易,怎么会有什么很大困难?楼主的很大困难具体指的是什么?另外,“花费一定的时间来构建链表”又具体指什么?
文章分类
收藏
    相册
    朋友
    jewely的Blog(RSS)
    Mailbomb的J2ME专栏(RSS)
    英文技术网站
    Code Guru
    Code Project
    NDSTech
    Planet Source Code
    Programmers Heavern
    SGI
    中文技术网站
    CSDN_GameDev的专栏(RSS)
    Winmag国际中文版(简体版)
    中国协议分析网
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 ASP.net动态调用非托管DLL的参数传递问题收藏

    新一篇: 如何正确创建DLL和使用DLL | 旧一篇: 简单内存池(Memory Pool)类的实现

     ASP.net动态调用非托管DLL的参数传递问题

    作者:骄傲的猫
    出处:http://blog.csdn.net/shardowm

    最近由于工作的原因碰到了在ASP.net调用非托管DLL参数传递的问题,结果花了半天时间终于比较完美的解决。特此写这篇文章与大家分享。这里主要讲解调用DLL时 参数传递的问题,对于如何调用非托管DLL网上有很多文章这里就不在重复了。

     LibInvoke是在ASP.net环境下调用非托管DLL了,在类中Invoke方法创建DLL中指定方法的Delegate 对象。

    public class LibInvoke
    {
      ...

      
    public Delegate Invoke(string APIName, Type t)
      
    {
                
    if (hLib == IntPtr.Zero)
                    
    throw(new Exception("未载入有效的DLL模块, 请确认DLL文件: " + strDLL + "是否有效!" ));
                
                IntPtr hApi 
    = IntPtr.Zero;
                hApi 
    = GetProcAddress(hLib, APIName);

                
    if (hApi == IntPtr.Zero)
                    
    throw(new Exception("无效的函数名: " + APIName));
                
                    
                
    return Marshal.GetDelegateForFunctionPointer(hApi, t);
        }

    }

     

     一. 内置类型

    对于内置类型(整型、布尔型、字符型)参数的传递是最简单的,只要直接传参数,并且直接处理返回值就可以了。

    private delegate bool Func1(int a, char b);


    public bool BaseTypeTest
    {
      Func1 fun 
    = (Func1)objInvoke.Invoke("BaseTypeTest"typeof(Func1));
      
    bool res = fun(1'A');
      
    return res
    }

     

    二. 字符串类型

     传入字符串时由于字符串编码问题的,有可能造成字符串到DLL中后变成乱码,所以在这里现将字符串都转换成byte型的数组,然后再作为参数传入到dll的函数中。 

    private delegate bool Func2(byte[] _appID, byte[] _paramVal);

    public bool StringTypeTest1(string appID, string paramValue)
    {
                Encoding e1 
    = Encoding.GetEncoding(936);
                
    byte[] b1 = e1.GetBytes(appID);
                
    byte[] b2 = e1.GetBytes(paramValue);

                Func2 func 
    = (Func2)objInvoke.Invoke("StringTypeTest1"typeof(Func2));

                
    bool result = func(b1, b2);

                
    return result;
    }

     

     如果dll中要返回一个字符串,则返回字符串只能作为函数的引用参数,而不能直接让函数返回一个字符串。以下代码就是调用dll中的

    void StringTypeTest2(char** a)

    函数。

     

    private delegate void Func3(out StringBuilder ret);

    public string StringTypeTest2
    {
            StringBuilder obj
    = new StringBuilder();

             Func3 func
    = (_Author)objInvoke.Invoke("StringTypeTest2"typeof(Func3));

             func(
    out obj);

            
    return obj.ToString();
    }

     所以在这里应该注意,在实现返回string或对象类型的函数是,不要让函数直接返回字符串或对象,而应把需要返回的字符串或对象作为引用参数。

     

     

    参考文献:
    [1] 《在 C# 中通过 P/Invoke 调用Win32 DLL Jason Clark
    网址:http://www.microsoft.com/china/msdn/library/langtool/vcsharp/ousNET.mspx

    发表于 @ 2007年12月05日 10:14:00|评论(loading...)|编辑

    新一篇: 如何正确创建DLL和使用DLL | 旧一篇: 简单内存池(Memory Pool)类的实现

    评论

    #sky04 发表于2008-05-07 09:36:42  IP: 124.42.47.*
    刚好在找这个方面资料,谢谢了
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 骄傲的猫