Error

C++博客 首页 新随笔 联系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

#

// 函数重载写法
 //    (return_arg-type(*)(arg1-type,grg2-type,...))&function
    module(L)
    [
        def("greet", (void(*)(void))&greet),
  def("greet", (void(*)(long))&greet),
  def("greet", (long(*)(long,float))&greet)
    ];

 // 成员函数重载用法
 // (return_arg-type (classname::*)(arg1-type,grg2-type,...))&classname::class_memberfunction

posted @ 2014-01-10 11:58 Enic 阅读(501) | 评论 (0)编辑 收藏

首先数据库定位分几块:机器名-实例名-数据库名

但是安装完成之后发现连不上08的数据库,最开始是应为没有填写实例名字,后来用ip/实例名还是连不上,但是pcname/实例名能连上。

排查之后是08的服务器没有打开tcp/ip
打开以后发现服务启动不了,应为端口冲突了,解决以后发现程序能上但是查询分析器不能上

查询分析器连接字符串应该是ip,port/实例




posted @ 2014-01-08 11:36 Enic 阅读(170) | 评论 (0)编辑 收藏

#include <iostream>
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <luabind/luabind.hpp>
using namespace luabind;
class TestClass
{
public:
TestClass(int a,int b);
static TestClass* Singleton();
int add();
virtual void ShowTest(std::string& strMsg);
private:
static TestClass* mSingleton;
int __a,__b;
};
void TestClass::ShowTest(std::string& strMsg)
{
std::cout << __FUNCTION__ << std::endl;
std::cout << strMsg.c_str() << std::endl;
strMsg += "000";
}
TestClass* TestClass::mSingleton = NULL;
TestClass::TestClass(int a,int b)
{
__a = a;
__b = b;
mSingleton = this;
}
TestClass* TestClass::Singleton()
{
if(TestClass::mSingleton == NULL)
{
return new TestClass(0,0);
}
else
{
return mSingleton;
}
}
int TestClass::add()
{
std::cout << __FUNCTION__ << std::endl;
return __a+__b;
}
int bindClass(lua_State* L)
{
open(L);
module(L)
[
class_<TestClass>("TestClass")
//.def(constructor<int,int>())
.def("add", &TestClass::add)
.def("ShowTest", &TestClass::ShowTest),
def("Singleton", &TestClass::Singleton)
];
return 0;
}
int LuaErrorCallBack(lua_State *L)
{
std::cout << __FUNCTION__ << std::endl;
return 0;
}
int main(int argc, char* argv[])
{
luabind::set_pcall_callback(&LuaErrorCallBack);
TestClass testClass(10,5);
lua_State* L = lua_open();  
luaL_openlibs(L);
std::cout << "init lua system" << std::endl;
bindClass(L);
std::cout << "do lua file" << std::endl;
try
{
std::string strFileName = "add.lua.ini";
int iRet = luaL_dofile(L, "add.lua.ini");
if (iRet != 0)
{
std::cout<<"loadfile error[file: " << strFileName.c_str() << "]: "<<lua_tostring(L, -1)<<std::endl;
}
//if (luaL_loadfile(L, strFileName.c_str()) != 0) {
// std::cout<<"loadfile error[file: " << strFileName.c_str() << "]"<<lua_tostring(L, -1)<<std::endl;
//}
//if (lua_pcall(L, 0, LUA_MULTRET, 0) != 0) {
// std::cout<<"pcall error[file: " << strFileName.c_str() << "]" <<lua_tostring(L, -1)<<std::endl;
//}
std::cout << "end" << std::endl;
//getchar();
}
catch(std::exception& ex)
{
std::cout << ex.what() << std::endl;
}
catch(luabind::error er)
{
std::cout << er.what() << std::endl;
}
lua_close(L);
return 0;
}


print("This is valid")
print(1234)
bad_function()
a = "meow"
b = 7
c = a + b
testClass = Singleton()
a = testClass:add()
print(a)
local valMsg = '中文'
testClass:ShowTest(valMsg)
print(valMsg)
posted @ 2014-01-06 16:49 Enic 阅读(237) | 评论 (0)编辑 收藏

// boost_test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <boost/smart_ptr.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class CTest
{
public:
virtual void TestShow()
{
std::cout << __FUNCTION__ << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef boost::function<void()> TVoidEvent;
std::vector<TVoidEvent> vVoidEvent;
for (int i = 0; i < 9; ++i)
{
boost::shared_ptr<CTest> spTest = boost::make_shared<CTest>();
boost::weak_ptr<CTest> wpTest(spTest);
//TVoidEvent voidEvent = boost::bind(
// [/*wpTest*/]()
// {
// //boost::shared_ptr<CTest> spTestTem = wpTest.lock();
// //if(spTestTem)
// //{
// // spTestTem->TestShow();
// //}
// std::cout << __FUNCTION__ << std::endl;
// }
// );
//TVoidEvent voidEvent = [spTest]
// {
// if (spTest)
// {
// spTest->TestShow();
// }
// };
// bind配合weak_ptr使用
//TVoidEvent voidEvent = [wpTest]
//{
// boost::shared_ptr<CTest> spTem = wpTest.lock();
// if (spTem)
// {
// spTem->TestShow();
// }
//};
// 直接把lambda和bind一起用编译有问题
TVoidEvent voidEvent = boost::bind(
[wpTest]
{
boost::shared_ptr<CTest> spTem = wpTest.lock();
if (spTem)
{
spTem->TestShow();
}
}
);
vVoidEvent.push_back(voidEvent);
}
std::for_each(vVoidEvent.begin(), vVoidEvent.end(),
[](TVoidEvent& voidEvent)
{
voidEvent();
});
return 0;
}


上面能过,下面就过不了,,,模板V5
               []{std::cout << __FUNCTION__ << std::endl;}();
boost::bind([]{std::cout << __FUNCTION__ << std::endl;});
posted @ 2013-12-31 17:02 Enic 阅读(448) | 评论 (0)编辑 收藏

记忆中获取dib位图是有顺序一说的,,,今天被坑了一把确实是有一说,是和图像的格式相关的,MSDN上这样描述:

A pointer to the bitmap buffer. If the bitmap is a bottom-up DIB, the pointer points near the end of the buffer. If the bitmap is a top-down DIB, the pointer points to the first byte of the buffer.

摘录网上查到的笔记:

CImage类提供了GetBits()函数来读取数据区,GetBits()函数返回的是图片最后一行第一个像素的地址,网上有人说返回指针的起始位置是不同的,有些图片返回的是左上角像素的地址,有些是左下角像素的地址,跟图片内部顺序有关。这里我们不必关心起始位置,只要很另外两个函数GetPitch()和GetHeight()一起使用就可以得到图片数据取得起始位置,定义数据区指针为BYTE* img_Data

img_Data=(BYTE *)m_Image.GetBits()+(m_Image.GetPitch()*(m_Image.GetHeight()-1));

这样,img_Data就是图片数据区的起始位置,这个公式是从codeproject里看到的,介绍的很精辟,可以从google里搜索到。其中GetHeight()函数返回图片的高度(以像素为单位)。GetPitch()返回图像的斜度,如果图像的顺序是从下到上(也就是GetBits()返回左上角像素的地址),这时GetPitch()返回一个负值,大小为图像宽所占有的字节数,例如24位800*600的图片,返回值应该是正或负的800*3。这样用每一行的字节数乘行数就可以得到起始位置了。

 

以上是使用CImage获取的时候遇到的坑爹,相信直接使用位图相关的api也是一样,msdn描述:

Device-Independent Bitmaps

There are two varieties of DIBs:

  • A bottom-up DIB, in which the origin lies at the lower-left corner.
  • A top-down DIB, in which the origin lies at the upper-left corner.

使用gdiplus的时候BitmapData也是类似:

Stride
INT
Offset, in bytes, between consecutive scan lines of the bitmap. If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up.

 

两个关键属性:

GetPitch( )

Stride

 

还有泥马一个被微软坑了的坏习惯,DWORD用习惯了,调试了一天都没看出来这两个值我取到的是负的,,,坑啊,,,

posted @ 2013-12-30 22:26 Enic 阅读(1064) | 评论 (0)编辑 收藏

image

posted @ 2013-12-28 14:47 Enic 阅读(194) | 评论 (0)编辑 收藏

UI线程无故进入死循环:
父子窗口重回
子窗口和父窗口重绘的相关关系:
WS_CLIPCHILDREN


标题栏闪动提示:
任务栏提示:
任务栏闪动
FlashWindowEx()
posted @ 2013-12-25 19:02 Enic 阅读(170) | 评论 (0)编辑 收藏

首先一个大观点:这tmd的根本就和IE控件或者网页控件无关,本身就是网页渲染器的效果。更直接的说就是网页本身的问题。

网络上一溜的解决方案大部分都是要把IE控件这个接口实现以下那个数据动一下,最终大概有两种办法:1.还是间接的修改了html;2.通过修改窗口rgn来达到目的。

 

其实关键的html就在这两句:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
<style type="text/css">
body{
border:0px;
overflow:hidden;
}
</style>

 

 

转载一下靠谱的方法:

如何去除Webbrowser滚动条、边框的方法

2010-05-22 13:34:44|  分类: Delphi、软件|字号 订阅

在使用delphi开发软件的时候,有时只需要显示webbrowser的网页内容,而不希望显示webbrowser滚动条或边框,那么我们如何实现这个效果呢?
    其实,这个问题不是webbrowser控件的问题,而是网页自身的css控制问题。我们通过调整目标网页的css效果就可以实现了。
webbrowser去除滚动条的方法
将 <body> 改成 <body scroll="no"> 即可。
webbrowser去除3D边框的方法
    在网页的head区域的css部分加上如下代码即可:
<style type="text/css">
body{
border:0px;
overflow:hidden;
}
</style>
    同时,将网页的顶部声明DOCTYPE改成 :
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    而不是 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 等其他这样的形式。

 

后来看了下优库的主页更牛逼:

<!DOCTYPE html>直接就没有

博客园的:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

163的:<!DOCTYPE html>

qqgame: <!DOCTYPE HTML>

 

 

好了,网站开发的却是不够敬业

posted @ 2013-12-24 00:11 Enic 阅读(448) | 评论 (0)编辑 收藏

QT的Event机制里边,所有的Event都是派生于QEvent类,然后Event派发的时候都是通过一个函数:event(QEvent*),通过QEvent::Type()获取到真实的类型,然后使用static_cast转换到实际的类型再派发到QXXEvent函数去处理。

这里是利用了CPP的rtii机制,但是为什么没有用dynamic_cast呢?猜测是为了效率。

但是这样有一个缺陷,就是当Type取到的类型和实际类型不一致的时候没有rtii的检测,可能导致类型不匹配,然后崩溃掉。。。

效率是一个原因,但是个人觉得,稳定性有限于效率。

即使测试了一下,500000次转换效率也不会太弱,继承数深度也不是和效率呈线型关系的:

class CRoot
{
public:
    virtual ~CRoot(){}
};

class CTest : public CRoot
{
public:
    virtual void ShowFunctionName()
    {
        std::cout << __FUNCTION__ << std::endl;
    }
};

class CTestEx : public CTest
{
public:
    virtual void ShowFunctionName()
    {
        std::cout << __FUNCTION__ << std::endl;
    }
    
    virtual void ShowOnlyForEx()
    {
        std::cout << __FUNCTION__ << std::endl;
    }
};


void Func(CTestEx *pTestEx)
{
    pTestEx->ShowOnlyForEx();
}

void Func(CTest *pTest)
{
    try
    {
        CRoot *pRoot = new CTestEx;

        boost::timer timerTest;

        timerTest.restart();

        for (int i = 0; i < 500000; i++)
        {
            CTestEx *pTextEx = nullptr;
            pTextEx = dynamic_cast<CTestEx*>(pRoot);
        }

        double dTime = timerTest.elapsed();
        std::cout << dTime << std::endl;

        timerTest.restart();

        for (int i = 0; i < 500000; i++)
        {
            CTest *pText = nullptr;
            pText = dynamic_cast<CTest*>(pRoot);
        }

        dTime = timerTest.elapsed();
        std::cout << dTime << std::endl;
        //Func(dynamic_cast<CTestEx*>(pRoot));
        //Func((CTestEx*)pRoot);

        timerTest.restart();

        for (int i = 0; i < 500000; i++)
        {
            CTestEx *pTextEx = nullptr;
            pTextEx = static_cast<CTestEx*>(pRoot);
        }

        dTime = timerTest.elapsed();
        std::cout << dTime << std::endl;
    }
    catch(std::exception& refException)
    {
        std::cout << refException.what() << std::endl;
    }
    catch(std::bad_cast)
    {
        std::cout << __FUNCTION__ << std::endl;
    }
    catch(...)
    {
        std::cout << __FUNCTION__ << std::endl;
    }
}

void Test()
{
    CTest *pTest = new CTest;
    Func(pTest);
}

0.031

0.033

0.001

debug模式下运行,感觉这个速度应该是能接受的。

向下类型转换的时候使用dynamic_cast应该是有必要的,所有咱们就这样用了吧,,,

posted @ 2013-12-22 21:11 Enic 阅读(208) | 评论 (0)编辑 收藏

1.为什么要自己撸一个UI库?

就好比做菜
从原材料做任何菜本来都很简单
非在别人做好的菜上来改
改来改去达不到效果说太难了

你丫有种你用红烧肉改一回锅肉试试?
世界上总有这么一批贱B
就想捡现成
越捡路越难还不知道反省

话说有一人拜师学厨
他想做道回锅肉给他老娘吃
徒弟:师傅,我想做道回锅肉,该怎么办呢?
师傅:你准备点五花肉,煮一下切来炒熟就好了
徒弟:可是那个难度太高了,再说时间太紧了,师傅,这盘
      红烧肉也是五花的,我初学,你还是教我怎么从红烧
      肉改回锅肉吧。等以后我水平提高了,有闲功夫了,
      再系统学习从生肉开始做回锅肉!
师傅:..................................

 

2.咱肯定是站在巨人的肩膀上,自己撸道行不够还不知道撸个什么出来。所以呢,一开始打算直接撸duilib,结果发现可能这货不够巨人虽然看起来所有功能都有了,但是用起来总觉得差了点什么。然后在喵上了chromium,泥马折腾好久发现提出一个ui库是不是太麻烦了,,,也投降了,然后瞅上了skia这货,有硬件加速啊,泥马结果能力还是欠缺了点,一口不能吃成胖子,,,然后开始撸uileeihcy,这个思想够丰富的库。发现也不是不能直接用。

好吧,我确实欠抽,,,

然后开始失败了无数次,放弃了无数次的自己撸一个想法又出现了,这次实事求是的撸吧。

 

今天主要看了下大概,不管是duilib、chromium、uileeihcy,他们都是把ui抽象出了一个基类:duilib的control chromium的view uileeihcy的object,不同的是有些control不是container,有些具有这些功能。chromium和uileeihcy都具base都具有container的功能,那咱就也要有这功能。chromium和uileeihcy的基类中有具有的功能:

1.属性;2.container;3.eventtarget;4.layout management;5.个控件的私有消息是自己检查产生派发的。

 

初步看起来都有一个共性,就是控件的消息自己处理,不过uileeihcy里边有的设计比较有特点,需要进一步分析以便理解他的设计思想:

image

posted @ 2013-12-02 00:15 Enic 阅读(697) | 评论 (2)编辑 收藏

仅列出标题
共22页: First 10 11 12 13 14 15 16 17 18 Last