Diddy 的个人资料Smoker's wEbLOg照片日志列表更多 工具 帮助

Access Office Word 2007 with automation using VC9.0

由于程序需要从Document的第一页到最后一页做一次循环,遇到不少问题;
首先是如何获取ActiveDocument的总页数,目前我只知道通过访问IDispatch* pdispDocument里的BuiltInDocumentProperties属性获取一个列表,再从列表根据Word定义好的整数当索引来访问之,这个索引值可以通过引用MSWorld.OLB获取,可之前因为使用c++的方式编写遇到引用计数器不正常的问题(直接导致javaw.exe访问非法被关闭)就换用纯C的方式进行编写,根据msword.olb里的定义如下:
Constant wdPropertyPages = 14
    Member of Word.WdBuiltInProperty
得知使用14号索引访问之,之前测试用的文档是三页,一直是正确的直至在投入使用前修改了这个测试用的文档(加了几十页,主要是看性能如何),发现根据这个值获取的页数一直是3…或者文档少于或等于三页的数据是正确的(奇怪),于是开始漫长调试终于找到一个能和页数正直相等的索引23,怎么找到的就不说了,只是不明白14号索引取到的值是什么东西;
另在Invoke方法时,参数需要倒着填,今天就这个鸟问题至少花了我三四个小时最后还是在MSDN上找到实例才解决该问题,大概因为VB和VC出入栈的次序不同,那么说Office 2007是用VB编写的了?
另一个值得记录一下的问题就是JNI了,使用java对象传递参数很麻烦,不过掌握之后也很容易,主要还是JNI里GetFieldID,GetMethodID等方法最后一个参数需要一个签名,这个签名可以通过javap –s <classname>的方式查看,为什么要签名?就是为了解决面向对象(java)和不面向对象(c)语言的一个区别:多态;贴段代码纪念下:
bool CallObjectEvent(JNIEnv * jEnv, jobject jParameter, char* methodName, bool* pBool)
{
    if(pBool == NULL) return false;

    jclass clazz = jEnv->GetObjectClass(jParameter);
    if(clazz == NULL) return false;
    jmethodID id = jEnv->GetMethodID(clazz,methodName,"()Z");
    if(id == NULL) return false;
    jboolean jContinue = jEnv->CallBooleanMethod(jParameter, id);
    *pBool = (jContinue == 1);

    return true;
}

Simple HTTP Server using Java

最近准备为组员组织一次HTTP原理的培训,之前准备过ASP.Net方面的类似课程,有些示例是用Python和C#编写的,因为组员用java,为了达到理想效果就编写了一个Java版本的HTTP Server,要注意的就是java的socket与windows socket库在使用方面有很大的不同,没有研究过unix下的socket不知道是不是类似的设计?
大致思路:基于socket侦听80端口(我本机有iis把默认端口修改为81),在收到client的请求之后解析请求命令,目前实现几个uri命令,我相信这有助于程序员理解JBoss一类的服务器的工作原理而更好的利用这些特性编写有效率的代码……
用bb测试效果不错哦~!

ComboBox items.count不等于DataSource实际的记录数的问题及解决方法

这个问题几周前就遇到了,当时选择绕行,今天又遇上,这次是狭路相逢了,问题是这样的:
ComboBox cmb = new ComboBox();
// init object cmb’s databinding info

cmb.DataSource = GetTableFromQuery(“select f1,f2 from table1”);
cmb.Parent = this;
MessageBox.Show(cmb.Items.Count.ToString());
会输出0,而非GetTableFromQuery返回的结果集的记录数。
这肯定是因为winform的数据绑定做了性能方面的优化导致的,stackoverflow.com有人介绍用performLayout()方法来解决,我想就是因为没有指定Parent之前ComboBox不会真地去加载数据,只有在Parent告之它应该加载数据时再加载,这就导致我的代码异常了,把上面的写法颠倒一下:
ComboBox cmb = new ComboBox();
cmb.Parent = this;
// init object cmb’s databinding info

cmb.DataSource = GetTableFromQuery(“select f1,f2 from table1”);
MessageBox.Show(cmb.Items.Count.ToString());
问题解决。。。

JNI: extend java features using VC9.0

最近经手的一个java项目里使用了jacob来操作Office,但是不定时地会出现异常导致javaw.exe/java.exe进程被关闭,查看日志异常是由从一个jacob的判断是否为空的函数开始产生的,一方面自己对java了解不深更不想一开始就去碰jacob这样的东西(相信很复杂),打算用JNI通过VC访问Office对象。
step 1. 编写如下java类
class COMIntf {
    native boolean InsertStampInEveryPage(String wordFilename,
            String pictureFilename);

    static {
        System.loadLibrary("libCOMIntf");
    }
}
step 2. 使用命令行生成C的头文件:
java COMIntf.java                                            #  will generate COMIntf.class file
javah –classpath .\ –jni COMIntf                        # will get COMIntf.h
-- context of COMIntf.h file --
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class COMIntf */

#ifndef _Included_COMIntf
#define _Included_COMIntf
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     COMIntf
* Method:    InsertStampInEveryPage
* Signature: (Ljava/lang/String;Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_COMIntf_InsertStampInEveryPage
  (JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif
step 3. 建立一个叫libCOMIntf的动态连接库的项目(注意大小写)
实现该接口,有几点需要注意,jstring不能直接操作,需要使用JEnvironment将其还原为UTF-8编码的字串,如果需要在UNICODE环境下进行编程的话还需要使用MultiByteToWideChar一类的函数进行转换,做完之后再使用JEnvironment释放相关资源
注意:一开始我使用智能指针来操作office在调用::CoUninitialize()时会出现异常,找了一上午资料终于在msdn一篇翻译得让人看不懂(看E文才明白)的文章里找到可能的答应,使用#import可能导致引用计数器异常,相信jacob和我遇到的情况应该一样,于是放弃好用的智能指针转用native C的方式调用office word 2007 com组件,巨痛苦的过程,许多地方的Invoke完成是猜着来的(可显这部分代码的精贵遂就贴出来了,自己收藏,哈哈哈),过去只是在Delphi里使用了Variant还有之前写PaPaDog的时候用过一点点VARIANT,总结一下:JNI的方式扩展java功能是个不错的方式,至少与com打交道还是用ms platform的东西方便。

Call CLR using MFC

最近有个项目需要从MFC里调用C#的组件,采用插件的方式组合。
可以使用CWinFormsView定义自己的基类容器用于装载C#编写的那些可视化组件:
///// DymanicView.h

#pragma once

#include <afxwinforms.h>

using namespace Microsoft::VisualC::MFC;

// CDymanicView view

class CDymanicView : public CWinFormsView
{
    DECLARE_DYNCREATE(CDymanicView)

protected:
    CDymanicView();           // protected constructor used by dynamic creation
    virtual ~CDymanicView();

public:
    virtual void OnDraw(CDC* pDC);      // overridden to draw this view

protected:
    virtual void OnInitialUpdate();
    virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
    virtual void OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);
#ifdef _DEBUG
    virtual void AssertValid() const;
#ifndef _WIN32_WCE
    virtual void Dump(CDumpContext& dc) const;
#endif
#endif

DECLARE_MESSAGE_MAP()
};

////// DymanicView.cpp

// DymanicView.cpp : implementation file
//

#include "stdafx.h"
#include "DymanicView.h"

// CDymanicView

IMPLEMENT_DYNCREATE(CDymanicView, CWinFormsView)

CDymanicView::CDymanicView(): CWinFormsView(::System::Windows::Forms::Control::typeid)
{
}

CDymanicView::~CDymanicView()
{

}

BEGIN_MESSAGE_MAP(CDymanicView, CWinFormsView)

END_MESSAGE_MAP()

// CDymanicView drawing

void CDymanicView::OnDraw(CDC* pDC)
{
    CDocument* pDoc = GetDocument();
    // TODO: add draw code here
}

void CDymanicView::OnInitialUpdate()
{
    CWinFormsView::OnInitialUpdate();
    GetControl()->Dock = System::Windows::Forms::DockStyle::Fill;
}

void CDymanicView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
    CWinFormsView::OnUpdate(pSender, lHint, pHint);
}

void CDymanicView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
    CWinFormsView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}

// CDymanicView diagnostics

#ifdef _DEBUG
void CDymanicView::AssertValid() const
{
    CView::AssertValid();
}

#ifndef _WIN32_WCE
void CDymanicView::Dump(CDumpContext& dc) const
{
    CView::Dump(dc);
}
#endif
#endif //_DEBUG

// CDymanicView message handlers
有几个细节需要处理一下,一个打开/clr编译开关,如果还需要静态加载一些Assembly的话同时使用/FU或/AI开关即可,很方便,不过今天花一天的时候很郁闷的调试这个程序,多年不用MFC许多东西都想不起来了,网络又慢得要命。
网上有不少资料,虽然不是很详细不过自己摸索着来很快也就掌握了,写来写去还是喜欢写C++程序,虽然每次修改之后至少编译三四次找错误,不过对自己的提高却很大,这几天心情不是太好,项目压力也大,马上放假了终于可以好好休息休息了

using CLR in VC9.0

老板发疯一样追求UI,一定漂亮精致、一定要方便、一定要有价值,后两者是我的十分认同的,前者那是留给与我另一个世界的人思考的;
从网页系统的表现来看,老板是个很注重细节的人,可苦于他自己已经多年不搞技术在表达上已经略显幼稚,我无意评价我的老板,反而我是在思考:这么一个没品味的民族又怎会细细何尝每个细节?如同满大街的Adidas/Nike/Pump/Kappa,时尚吗?我看到多半是没素质没涵养的人群,穿得再光鲜同样挤在不舒服的公车里,开着BMW也每天和我一样穿过工地,越过巨型停车场……生存压力太大,幸福的光环最多辐射自己和家人(这就足够了?),缺乏幸福感的国度。废话打住!想来想去Office2007让人耳目一新,如果像它一样老板应该没话说了,建立MFC应用的向导里有Office2007风格模板,如果选择用WinForm实现就找那堆套控件也够受的,而且之后还有些网络通讯要求极BT的东西,700MB/每人的东西1000多人一起传,两台服务器,我怎么也不明白,这东西是不是在挑战人类极限?
用MFC写界面(POP点的)那是相当不易的事儿,我在VC方面的积累还主要是操作系统方面的东西,UI从来都用Delphi解决大不了赛个HTML了事,其实MFC调用CLR就是通过COM接口的方式,理解这一点也就想通了,改天又把程序贴上来纪念下。今天又收到QJExpertMIS的修改列表,终于不再崔命一样了,不过也好不到那去,为了这事儿正常工作耽搁不少,想起最近通宵达旦都干了好几次,瘦得只除骨头了,这项目至少达到我其中一个目的:Onions可以快速地开发应用程序,至少这一点让我觉得幸福,今天又把Ary拉进来,希望能通过它加强一下Onions安全方面的性能,随后的工作流我想也不是什么问题,就是时间呀,怎么都不够用。。。。

郁闷

今天相当郁闷,被一只小菜鸟说我领导无方,我这个气呀……
此事引以为鉴,连这种扫垃圾的小鸟都可以脱口而出只能说明自己确实有问题,只是自己一直感觉良好,反而给我这性能一般超速行驶的破车一脚急刹,我怎么会蠢到让只小鸟来告诉我怎么飞行呢?大脑进水了,该补脑了

trouble with hiding IE7.0 or later addressbar

The behavior described in this comment is by-design. In Internet Explorer 7 and later, you cannot remove the address bar in Internet Zone windows, for security (anti-spoofing) reasons. As described in the MSDN article above, in IE7 and later, location=no simply hides the back/forward/stop navigation buttons, and makes the address bar read-only. (The reason you can hide the address bar when the file is saved locally is that the file is opened in the Local Machine zone rather than the Internet Zone.)

-EricLaw, Program Manager, Internet Explorer Security.

The address bar is not supposed to come in a pop up, if we are setting "location=no" in the input "Features" of window.open(). It is coming at certain situations as follows. Please let me know why it is coming like that.

Steps to reproduce this issue

懒人和弱智

   当你骂一个人说他怎么这么懒,一般不在乎,多半还跟你嬉皮笑脸,甚至说是他的一种生活方式;反而你骂他是弱智的时候他肯定跟你脸红脖子粗,露袖子动粗,非要搬回自己的那点点根本上不了称板的“尊严”。
可在我看来一个懒人还不如一个弱智对这个社会有价值。懒惰的人大多智商也有点问题。懒得去细想,懒得去细算,久而久之部分脑细胞也退化了,在某方方面的表现也就越现弱智。
   最后,顶多也就算一个能吃能拉消耗地球资源的一个发热源。这几年的自己正呈现这样的趋势,越来越懒,本来智商就略显不足,再染上这种恶习,几近弱智了……有必要格式化一下自己,重装个系统,经济允许的情况下再装个防毒插件……越说越离谱,懒得写了,继续弱智,钝化也许才是能抓到老鼠的好猫。

LuaInterface+.Net CLR

from CLR to Lua
引用一下LuaInterface(http://luaforget.net),有手册可以参考,很简单就可以使自己的程序支持lua了
from lua to CLR, ref form.lua
-- kevinh - the following lines are part of our standard init
-- require("compat-5.1")
luanet.load_assembly("System.Windows.Forms")
luanet.load_assembly("System.Drawing")
Form=luanet.import_type("System.Windows.Forms.Form")
Button=luanet.import_type("System.Windows.Forms.Button")
Point=luanet.import_type("System.Drawing.Point")
form1=Form()
button1=Button()
button2=Button()
function handleClick(sender,data)
  if sender.Text=="OK" then
    sender.Text="Clicked"
  else
    sender.Text="OK"
  end
  button1.MouseUp:Remove(handler)
  print(sender:ToString())
  print("\n")
end
button1.Text = "OK"
button1.Location=Point(10,10)
button2.Text = "Cancel"
button2.Location=Point(button1.Left, button1.Height + button1.Top + 10)
handler=button1.MouseUp:Add(handleClick)
form1.Text = "My Dialog Box"
form1.HelpButton = true
form1.MaximizeBox=false
form1.MinimizeBox=false
form1.AcceptButton = button1
form1.CancelButton = button2
form1.Controls:Add(button1)
form1.Controls:Add(button2)
form1:ShowDialog()
很好很强大的功能,不过目前不知道可以用在什么地方,呵呵

Django

今天突然想掌握一个新东西,于是就从自己比较喜欢的语言着手——Python
之前学习zope的时候感觉很难明白zope开发的理念,而学习Django的时候发现与Onions的想法有一曲同工之妙,现在就把自己的学习过程阐述一下:
1、安装Python2.5.4,安装MySQL5.1或者SQLLite之类的数据库,安装Python MySQL(www.python.org里找与mysql相关的就找着了)的扩张,安装django 1.0.2
以上安装过程省略若干字……
2、按照django的教程开始自学(http://docs.djangoproject.com/en/dev/intro/tutorial01/)
教程里的代码有一部分与1.0.2不兼容的情况,在urls.py里对admin目录请求时使用的响应chunk应该是:
(r'^admin/(.*)', admin.site.root),
在编写admin.py里的was_published_today方法是,该方法django框架将传入两个参数,而教程里给出的示例只有一个参数,会出现异常
def was_published_today(sender,self):
    return self.pub_date.date() == datetime.date.today()
第一个参数不知道是什么,不是None有内容目前不知道是什么,不过第二个参数就是教程里说的self了
整个学习过程大约三小时,架构的效率对于开发来说不错,就是采用了类似MVC的分层设计如果没有很前瞻的设计玩起来一定很痛苦,还有就是基于template的方式有一大堆django定义好的语法和变量,看着就头大,实际编写过程一定会有不少问题,加上python引用没有很好的ide环境,要深入了解django的代码有一定难度,发烧或者自己玩玩可以,用这东西做项目,想想算了,没胆尝试。。。。

就想发牢骚

  我记忆里最深刻的音乐其实是一盒磁盘,依稀记得是一个叫xxxx Philips音乐手的木吉他,很抒情很打动我的音乐;
  那会儿忘了是从哪里弄了些喇叭,把它们按功率大小一个个串在我书桌下的那个比较私密空间里,放学回家就开始听那盒磁带如果刚好有点老爸没喝完的小酒再妙不过了。
  也是从那会儿开始对吉他着了迷,对纯音乐(没有一丝人声)也喜欢上了,所以后来窦唯纯音乐的CD很是喜欢。
  不记得在那里找到了一盒叫《Here, There And Everywhere》由Sébastien Schuller用古典吉他演奏的音乐,首先是名字是我喜欢的Beatles的歌,amazon.com上有购,等再下下决定把它也收了。
  不过,昨天在google music里找到类似的音乐叫Here, There & Everywhere (The Songs Of The Beatles),很不错。
  我一直想纳闷,吵闹的rock我也很喜欢,而像木吉他、小提琴这类组成的轻音乐我同样喜欢,完成不同的东西,怎么会被我同时喜欢上的。。。然后,突然想找找Paul Gilbert的电吉他刺激一下神经,无意就发现了这只乐队:Samad,应该是阿拉伯国家歌(目测)。
  最近把Onions的工具强化了一下,可当基础功能做完之后突然觉得很疲惫。

用Lua做自己的脚本解释器

1、从http://www.lua.org/download.html找一5.x的版本下载之,将下载之文件压缩到某个目录(如:D:\Lua);
2、build lua 解释器,运行"Visual Studio 2008 命令提示"
3、CD到你的lua目录(cd d:\lua);
4、执行lua目录下的etc目录里的luavs.bat,顺利的话半分钟时间就生成lua.dll,lua.exe等文件
5、http://luaforge.net/projects/luainterface/下载luainterface.dll
6、引用luainterface.dll到你的工程里
下面是一个简单的例子:
using System;
using System.Collections.Generic;
using System.Text;
using LuaInterface;
using System.Reflection;

namespace ConsoleApplication2
{
    class Program
    {
        private bool bRunning = true;
        public static Lua pLuaVM = null;

        public Program()
        {
            pLuaVM = new Lua();
            MethodInfo mInfo = this.GetType().GetMethod("quit");
            pLuaVM.RegisterFunction("quit", this.GetType(), mInfo);
        }

        public void quit()
        {
            bRunning = false;
        }

        static void Main(string[] args)
        {
            Program pPrg = new Program();
            Type pPrgType = pPrg.GetType();
            MethodInfo mInfo = pPrgType.GetMethod("quit");
            pLuaVM.RegisterFunction("quit", pPrg, mInfo);
            pPrg.Run();
        }

        public void Run()
        {
            String strInput;

            while (bRunning)
            {
                Console.Write("> ");

                strInput = Console.ReadLine();
                if (strInput == "bye")
                    bRunning = false;
                else
                {
                    Console.WriteLine();
                    try
                    {
                        pLuaVM.DoString(strInput);
                    }

                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }

                    finally
                    {
                        Console.WriteLine();
                    }
                }
            }
        }
    }
}

阿昌寨

我家楼下有家阿昌寨餐馆,东西还算得上好吃也算得上刀快,每每过几天就要吵到深夜,今天也一样,寂寞的阿昌们又在约会,殊不知这里不是村子,不像在大山里可以尽情狂欢,混凝土的森林里不需要这种方式,这个森林里的动物们会到让人欲望膨胀的地方撒野。
今天开始我会向上帝祈祷你们倒闭关门,滚回火星去,地球不欢迎你们,阿们。。。

P'是与P1,P2确定的直线方程的直线距离方程批实现

在写建模工具时时常用需要用得到这样的算法:通过用户点击的点来确定是否选中某一斜线。
算法是这样的,根据点击确定一直线再计算用户点击的点与该直线的直线距离是否位于某个区间,小于该区间即被选中。
//////////////////////////////////////////////////////
//
//
// 利用直线方程,求证X,Y到两点确定的直线的距离
// Percision 为精度(距离)
// 注:两点式直线方程为: (y-y1) = [(y2-y1)/(x2-x1)](x-x1)
//  一般方程为:       [(x2-x1)y] + [-(y2-y1)x] + [x1(y2-y1) - y1(x2-x1)] = 0
//           A = -(y2-y1)
//           B = (x2-x1)
//           C = x1(y2-y1) - y1(x2-x1)
//           点,{x,y}
//    点到直线的方程为: d = abs[(Ax+By+C)/sqrt(A*A+B*B)]
function PointInLineFunc(const P1, P2: TPoint; const X,
  Y: Integer; const Precision: Double): Boolean;
var
  y2y1              : Integer;
  x2x1              : Integer;
  A, B, C           : Integer;
  d                 : Double;
begin
  result := False;
  if (P1.X <> P2.X) and (P1.Y <> P2.Y) then begin
    if P1.X > P2.X then begin
      if P1.Y > P2.Y then begin
        result := (X < P1.X) and (Y < P1.Y) and (X > P2.X) and (Y > P2.Y)
      end
      else if P1.Y < P2.Y then begin
        result := (X < P1.X) and (Y < P2.Y) and (X > P2.X) and (Y > P1.Y)
      end
    end
    else if (P1.X < P2.X) then begin
      if P1.Y > P2.Y then begin
        result := (X < P2.X) and (Y < P1.Y) and (X > P1.X) and (Y > P2.Y)
      end
      else if P1.Y < P2.Y then begin
        result := (X < P2.X) and (Y < P2.Y) and (X >= P1.X) and (Y > P1.Y)
      end;
    end
  end
  // 垂直或平行与X轴的直线
  else if (P1.X <> P2.X) or (P1.Y <> P2.Y) then begin
    if P1.X = P2.X then begin
      if P1.Y > P2.Y then
        result := (ABS(X - P1.X) <= Precision) and (Y > P2.Y) and (Y < P1.Y)
      else
        result := (ABS(X - P1.X) <= Precision) and (Y < P2.Y) and (Y > P1.Y)
    end
    else begin
      if P1.X > P2.X then
        result := (ABS(Y - P1.Y) <= Precision) and (X > P2.X) and (X < P1.X)
      else
        result := (ABS(Y - P1.Y) <= Precision) and (X < P2.X) and (X > P1.X)
    end;
  end;
  if not result then Exit;
  y2y1 := P2.Y - P1.Y;
  x2x1 := P2.X - P1.X;
  A := -y2y1;
  B := x2x1;
  C := P1.X * y2y1 - P1.Y * x2x1;
  d := abs((A * X + B * Y + C) / sqrt(A * A + B * B));
  result := d <= Precision;
end;
这是诺干年前的代码了,现在再回顾,真得觉得自己才华横溢呀……

近况

  最终还是上java了这贼船,从我开始厌烦它到现在已经有那么6、7年时间了,而现在再查资料了解java的时候已经不再那么偏激,也惊叹java发展的速度,可骨子里我还是很喜欢C++和Parscal。为什么?习惯成自然了吧。要讲开发效率,首先动态语言,要讲学习研究还是把重点放回C吧。
  之前有尝试转做营销方面工作的打算,可老婆开导之后(其实更多是自己有点退缩)还是选择不浪费已经积累近十年的软件开发经验。
打算去的新东家也不是十分满意,一个是待遇,还有一个就是职位,不过毕竟谈到java我可能连一个刚毕业两三年的新手都不如。不过,厚积薄发是我的特点,技术之路如同长跑,没有天赋没有苦练没有智慧都会失败,所以新东家的高手们小心了,别说死得莫名,wuhahaha
  近半年打LT3C成瘾,已经严重影响自己生活质量和工作能力,也许是才真正独立有了自己的家庭,凡事都有个磨合期嘛,不过我至少已经意识到这问题的严重性了,这毛病不可以有!总结一下玩LT3C的思考:在游戏里骂垃圾的大多工作和生活里是新垃圾,大把时间都花在提高APM玩猥琐了,可以想像这人要么孩子气让人够受要么RP绝对有问题,孔子说:游戏是一个人本性的反射。没有好与不好的队长或队友,而是有没有良好的一个团队才这是个游戏胜利的根本。
最近瘦得一塌糊涂,很难想像才毕业时72KG的感觉了,工作之后再没有上过70KG。。。

HD201

最近,对佩戴型耳机比较发烧,刚好有个同事也有此嗜好,约着一起在amazon.cn买了两副佩戴型耳机,相对之后觉得森海塞尔性价比高,质量稳定,于是有了下面的对比:
1、)首先是我的HD201
听音乐来说,层次感不太强,我听jazz和hardrock多些低声就不用提了。唯一有一点,佩戴压耳朵,HD201是封闭式耳机,就是有点闷,尤其天热的时候有点难受,我比较喜欢这副耳机“低调”的外形;
2、)我同事的HD457
听摇滚或者对大场景的音乐的时候,层次感很强,低声也很赞,就是什么音乐都一个味没个性,时间戴长了耳朵会不舒服,外形上有点时尚。

Visual Studio 2008 插件开发(四)

如果要添加新的内嵌资源ProjectItem时候,目前我知道的有两个途径:

1、通过修改模板中的工程文件(*.csproj)文件里定义:

clip_image001

2、通过代码的方式:

如果你的ProjectItem和我一样需要根据用户定义的选项才知道需要添加多少个的时候,就需要这种方式了。

在AddProjectItem或AddFromFileCopy返回的ProjectItem里有Properties属性其中有大量的信息,有些信息在VS的属性编辑器里是看不到了,以下我Debug输出的情况:

providers.config is {6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}

Extension:.config

FileName:providers.config

CustomToolOutput:

DateModified:2009-6-23 16:01:49

IsLink:False

BuildAction:3

SubType:

CopyToOutputDirectory:0

IsSharedDesignTimeBuildInput:False

ItemType:EmbeddedResource

IsCustomToolOutput:False

HTMLTitle:

CustomTool:

URL:file:///D:\temp\BrokerLibrary1\BrokerLibrary1\Config\providers.config

Filesize:14782

CustomToolNamespace:

Author:

FullPath:D:\temp\BrokerLibrary1\BrokerLibrary1\Config\providers.config

IsDependentFile:False

IsDesignTimeBuildInput:False

DateCreated:2009-6-23 16:01:49

LocalPath:D:\temp\BrokerLibrary1\BrokerLibrary1\Config\providers.config

ModifiedBy:
如果想把这个ProjectItem设置为嵌入资源就将BuildAction属性修改为3(应该是个枚举类型的),Like following

EnvDTE.ProjectItem item = mappingFolder.ProjectItems.AddFromFileCopy(mappingFile);

item.Properties.Item("BuildAction").Value = 3;

昨天做了一个奇怪的梦,梦见自己身处伦敦一个Adidas的仓储式商店里,可商店里又充满恐怖的气氛,有许多空空的黑暗的屋子,背景是些R&B的音乐节奏很棒。好像我和朋友在逛街,遇到一辆Made in china的三轮摩托,然后就空白了。
腻味了IT这个鸟行业,死气沉沉毫无活力,像极了某些音乐。

vs2008 add-in 编写(三)

add-in的功能只是与IDE接口并扩展IDE的功能,我只是把它理解为入口点,如果是像通过插件的方式增加新类型的项目或项目项其工作量大的有点吓人。
还好visual studio自身的架构很灵活,可是采用如下方式进行:
http://msdn.microsoft.com/en-us/library/6db0hwky.aspx
当越往深处走的时候,越法让人头大,MSDN只是给了一些入门级的文章,更多的还是需要自己去猜。
如:我有一个工程模板,需要由用户的选择来确定需要加入多少个文件,这些文件都需要被模板变量进行替换,这会麻烦事儿来了:
有一大堆模板变量我是不知道在哪里生成的,最后好不容易在Common7/IDE/下找到一个貌似有些关联的文件:Microsoft.Visualstudio.TemplateWizard.dll,这个是在调度状态下观察Output里的信息发现的,用Reflector打开之,发现有一个叫Wizard的类,可是不知道怎么用,也不知道VS IDE是在什么过程里为它加入的,看样子只是自己写一个类似的生成器了。