存档

‘拙手偶得’ 分类的存档

如何在GODADDY的SHARED HOSTING空间里增加SVN客户端

2009年8月14日 aeolus 没有评论

Godaddy的Shared Hosting空间可以使用SSH远程登录,但未提供SVN支持,而且更要命的是未能提供任何Development Enviorment,没有GCC的支持自然也就无法通过编译SVN源码来增加SVN.  在网上搜了一下找到一个方法, Godaddy的OS是CentOS 5.2. 可以直接使用CollbNet RedHat binary文件运行. 有人制作了一个SVN的安装包. 具体安装方法如下:

1.开通Godaddy的SSH,可以参照Godaddy的网站说明

2.登录后,下载SVN安装包

wget http://www.erikfantasia.com/download/godaddy-svn-1.5.6.tar.gz
3. 解压
tar zxvf godaddy-svn-1.5.6.tar.gz
4.修改BASH环境
如果未设置过 .bashrc使用
mv bashrc.svn .bashrc
或者将下列代码添加到.bashrc中
export PATH=$PATH:$HOME/svn/bin
export LD_LIBRARY_PATH=$HOME/svn/lib
按说到这步,以后每次登录,都应该自动运行 .bashrc就能直接运行SVN命令了,
但不知道为何我的主机好像没有运行 .bashrc,因此每次登录的时候都要用
source .bashrc 运行一次,才能修改环境使用SVN.
参考地址:
http://erikfantasia.wordpress.com/2009/03/18/subversion-on-godaddy-shared-hosting/
(thanks GFW, 此链接需翻墙打开)

WINDOWS Media Center Edition 安装手记

2009年8月14日 aeolus 没有评论

2006年04月16日 星期日 09:24

一时兴起买了个XBOX 360,拿回来傻眼了,要和PC联合工作必须装WINDOWS XP Media Center Edition 2005. 没办法,在 http://www.bitower.com上搜了一个BT下载http://bbs.btmyth.com/attachment.php?aid=96167. 下回来有两个ISO,为了试验,先在我的机器上装了个VMWARE 5.0虚拟了一台主机,分配了320M内存4G空间,反正以后可以改先试试看.

安装的界面和装XP几乎一样,尤其是前面的DOS安装部分,没有任何区别.开始让我担心了半天以为下错了东西.等进入WINDOWS安装界面安装中会提示更换光盘.更换两次后安装完毕,其间的序列号采用4 IN I算号器用366段安装.

安装完毕后发现界面和XP还是不一样了,开始菜单多了很多东西,现在再启用算号器算一个11段的号码,用换号器更换号码,再用在线激活程序激活.

现在可以去WINDOWS UPDATE,UPDATE操作系统了.但是麻烦来了,现在的WINDOWS需要正版验证了,在网上搜了一下找到一个最简单的方法,在C:\Documents and Settings\All Users\Application Data\Windows Genuine Advantage\data,将DATA.dat文件改名成data1.dat,在建立一个文本文件里面敲入Microsft,将此文本文件名改为data.dat,并设为只读.OK,现在UPDATE没问题了.

为了连接XBOX360下面需要下载几个东西,先是在MICROSOFT下载 .NET FRAME WORK1.1及SP1(用WINDOWS UPDATE就可以)

然后再下载http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=169757bb-3a50-4d8d-99bd-f24c7f1d7855 和 http://www.microsoft.com/downloads/details.aspx?FamilyID=e5daf37e-e243-4410-bc51-81cf2b56fe6e&DisplayLang=zh-cn这两个东西是MCE的更新汇总ROLLUP1和ROLLUP2.

这些都装完后到http://www.xbox.com/pcsetup自动下载XBOX的连接,安装时需要输入8位数字,这8个数字可在XBOX的”媒体->WINDOWS MEDIA CENTER”选择时得到.

下面的安装基本上参照提示一步一步就可以了,安装完毕后就可以在XBOX上使用MEDIA CENTER和PC交换文件了.

有一个小窍门,可以将网上邻居的任何一个共享目录拖入安装WINDOWS XP MCE的机器的我的音乐我的视频等目录.如此一来虚拟机上几乎不用拷贝东西就能跑了.

分类: 拙手偶得 标签: , ,

编译LUA时的问题

2009年8月14日 admin 没有评论

今天在编译一个LUA接口的DLL时发现总是出unresolved external symbol _errno,LINK 2001错。郁闷了半天,最后发现该接口调用的一个LUA库时使用 SINGLE THREAD 编译的,改成MULTI THREAD 编译一切OK。

分类: 拙手偶得 标签:

EXCEL VBA中调用C++ DLL中的函数

2009年8月14日 aeolus 没有评论

2006年08月9日 星期三 17:39

1.关于EXCEL的运行目录

EXCEL 打开一个XLS或XLA文件时,其缺省的运行目录是 C:\Program Files\Microsoft Office\Office10,因此加载DLL的时候会报找不到DLL文件,需要将相关的DLL(注意DLL可能会调用其他的非操作系统DLL)全部拷贝到 SYSTEM32或者设置运行环境变量中的PATH,把放DLL的目录加入PATH。

2.关于DLL中的函数名及调用格式

为了VBA能够调用C++写的DLL,在定义DLL函数时一定要加上__stdcall.及 EXTERN “C”

如:

extern “C” __declspec( dllexport ) int  __stdcall ExcelInterface_GetQueryData(int row, int column, LPTSTR retStr);

函数体为:

int __stdcall ExcelInterface_GetQueryData(int row, int column, LPTSTR retStr)
编译完成后用 Dependecy walker一类的工具看DLL输出的函数名可能会有变化,比如:

_ExcelInterface_GetQueryData@12

在VBA中定义的时候这样写:

Declare Function ExcelInterface_GetQueryData Lib “MOinterface” Alias “_ExcelInterface_GetQueryData@12” (ByVal row As Long, ByVal col As Long, ByVal retStr As String) As Long

3.关于函数中传回的字符串

DLL函数中如需返回字符串比较有讲究,

首先要在参数中回传字符串(C函数直接返回字符串好像不行)。

另外说明参数时一定要用ByVal不能用ByRef ,因为VBA的字符串传递的时候用的是指针。在传递以前,要给字符串分配足够的空间,在C函数中用strcpy copy进去。另外传入的参数不能用局部变量一定要用全局量(这个绕了我半天,不知道原因)。例子:

注意变量bb的定义,是全局的。

Dim bb As String

Sub abc()
Dim aa
Dim cc As String

Call ExcelInterface_Initialize
aa = ExcelInterface_ConnectDB()
aa = ExcelInterface_QueryData(”select * from abc”)
bb = String(256, vbNullChar)
aa = ExcelInterface_GetQueryData(0, 0, bb)
cc = Left(bb, _
InStr(1, bb, vbNullChar) – 1)

aa = ExcelInterface_GetQueryDataRowCount()
Call ExcelInterface_CloseDB

End Sub

参考http://www.microsoft.com/china/msdn/Archives/voices/office03082001.asp

分类: 拙手偶得 标签: , ,

ISAPI与其他桌面应用程序通信

2009年8月14日 aeolus 没有评论

2005年11月10日 星期四 14:01

最近有个项目,客户需要通过浏览器查询一个运行与WEBSERVER上的普通应用程序的一些输出结果。我设想通过写一个ISAPI程序接收客户请求,然后由ISAPI通知应用程序输出计算结果。原本以为很简单的一个问题,让ISAPI直接向应用程序发个消息就成。后来发现由于ISAPI程序与IIS运行在同一程序空间,根本无法通过FindWindow一类的方法获得应用程序的窗口句柄,即使通过一些非常规的方法获得了城口句柄也无法向应用程序发送消息。原因还不能很准确的解释,估计是因为SERVICE程序的特殊性造成的吧。为了解决这个问题,想了很多办法,后来采用了利用SOCKET 象本机应用发送UDP报文的办法解决。注意只能采用标准的SOCKET编程,不能使用MFC的SOCKET类,因为在ISAPI的DLL中无法完成AfxSocketInit。关键代码如下:

ISAPI侧:

在构造函数中初始化SOCKET

WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
m_sendSocks=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP );

接受用户请求后发送UDP报文:

void CAewebExtension::GetPic(CHttpServerContext* pCtxt, LPTSTR  szParam)
{

……..

char szSend[20];
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6801);
addr.sin_addr.s_addr = inet_addr(”127.0.0.1″);
sprintf(szSend,”%s,%d”,magicWord,seqNo);
sendto(m_sendSocks,szSend,strlen(szSend),0, (struct sockaddr*)&addr, sizeof(struct sockaddr));
…….

}

析构函数

closesocket(m_sendSocks);
WSACleanup();

在应用程序侧由于是MFC的标准应用可直接采用CSocket类。在应用程序的MAINFRM里直接创建一个接收线程用于接受ISAPI的报文。

在ONCREATE里加入:

AfxBeginThread(WebNetMessage,(LPVOID)this->GetSafeHwnd()); //创建接收线程

线程代码:

UINT WebNetMessage( LPVOID pParam )
{
CSocket sockRecv;
CString csTmp,csTmp1;
sockRecv.Create(6801,SOCK_DGRAM,”127.0.0.1″);
sockRecv.Bind(6801,”127.0.0.1″);

while (true)
{
WPARAM wParam;
char szRecv[20];
CString szIP(”127.0.0.1″);
UINT uPort=6800;
int iRecv =sockRecv.ReceiveFrom(szRecv,20,szIP,uPort,0);
TRACE(”received %s total=%d\n”,szRecv,iRecv);
szRecv[iRecv]=”;
csTmp=szRecv;
if (csTmp.Left(strlen(magicWord)).Compare(magicWord)==0)
{
csTmp1=csTmp.Right(csTmp.GetLength()-strlen(magicWord)-1);
wParam=atoi(csTmp1.LockBuffer());
csTmp1.UnlockBuffer();
::SendMessage((HWND)pParam,g_msg_request_pic, wParam,0 );
}

}

return 0;
}

ok, it works now.用这个办法是个比较简单的实现方法。欢迎诸位讨论。

分类: 拙手偶得 标签: , , ,

用部分标题查找WINDOWS 窗口

2009年8月14日 aeolus 没有评论

2005年11月10日 星期四 12:59

用Windows API的FindWindow函数查找窗口是最常用的方法,但需要提供ClassName和完整的窗口标题,对于大多数的应用ClassName几乎无法得到,对于某些窗口比如MDI窗口的标题往往会在打开不同的文档时标题也会改变,我们只能知道窗口的部分名称。此时无法使用FindWindow.WINDOWS API的EnumWindows这个函数可以穷举所有的窗口,利用这个函数我写了个简单类可以实现利用部分窗口的文字查找到所需的窗口。程序比较简单,但稍加扩展可以做的很强。程序如下

// NFFindWindow.h: interface for the CNFFindWindow class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_NFFINDWINDOW_H__4311FDC0_B190_448D_80DC_31D66CC4EDF1__INCLUDED_)
#define AFX_NFFINDWINDOW_H__4311FDC0_B190_448D_80DC_31D66CC4EDF1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WND_TITLE_LEN  256
typedef struct
{
HWND hwnd;
char wndTitle[WND_TITLE_LEN];
}WINDOW_INFO;

typedef vector <WINDOW_INFO> WNDLISTTYPE;
class CNFFindWindow
{
private:
WNDLISTTYPE m_vector_winList;
static BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lp);
public:
HWND FindStrInTitle(CString str);
CNFFindWindow();
virtual ~CNFFindWindow();

};

#endif // !defined(AFX_NFFINDWINDOW_H__4311FDC0_B190_448D_80DC_31D66CC4EDF1__INCLUDED_)

// NFFindWindow.cpp: implementation of the CNFFindWindow class.
//
//////////////////////////////////////////////////////////////////////

#include “stdafx.h”
#include “NFFindWindow.h”

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CNFFindWindow::CNFFindWindow()
{

}

CNFFindWindow::~CNFFindWindow()
{

}

BOOL CALLBACK CNFFindWindow::MyEnumWindowsProc(HWND hwnd, LPARAM lp)
{
WNDLISTTYPE *wndList;

wndList=(WNDLISTTYPE*) lp;
char buffer[WND_TITLE_LEN];
WINDOW_INFO wndInfo;

::GetWindowText(hwnd,buffer,WND_TITLE_LEN);
wndInfo.hwnd=hwnd;
strcpy(wndInfo.wndTitle,buffer);

wndList->push_back(wndInfo);

return true;

}

HWND CNFFindWindow::FindStrInTitle(CString str)
{
WINDOW_INFO wndInfo;
CString csTmp;

m_vector_winList.clear();
EnumWindows(MyEnumWindowsProc,(LPARAM)&m_vector_winList);
for (unsigned int i=0; i<m_vector_winList.size();i++)
{
wndInfo=m_vector_winList[i];
csTmp=wndInfo.wndTitle;
if (csTmp.Find(str)>=0)
{
return wndInfo.hwnd;
}
}
return NULL;
}

实用举例:

CNFFindWindow findWnd;

HWND hwnd=findWnd.FindStrInTitle(”记事本”);

if (hwnd)

{

AfxMessageBox(”记事本正在运行”);

}

else

{

AfxMessageBox(”记事本未运行”);

}

分类: 拙手偶得 标签: