青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

#

    今天很偶然的在cppblog上看了個博客,提到這個API,然后我想起來之前很困惑的一個問題。為什么別人的程序.exe和.dll是放在不同目錄的,而我的不能。起初我想的是也許只能用添加path這一招了。今天偶然看到這個函數(shù)順便msdn一下發(fā)現(xiàn)還是挺有用的。以后俺們的dll和exe也不用惡心的都丟到一起了,可以根據(jù)模塊和功能放到不同的目錄了。

   

 

SetDllDirectory function

9 out of 18 rated this helpful - Rate this topic

Applies to: desktop apps only

Adds a directory to the search path used to locate DLLs for the application.

Syntax

C++

BOOL WINAPI SetDllDirectory(
  __in_opt  LPCTSTR lpPathName
);

Parameters
lpPathName [in, optional]

The directory to be added to the search path. If this parameter is an empty string (""), the call removes the current directory from the default DLL search order. If this parameter is NULL, the function restores the default search order.

Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

The SetDllDirectory function affects all subsequent calls to the LoadLibrary and LoadLibraryEx functions. It also effectively disables safe DLL search mode while the specified directory is in the search path.

After calling SetDllDirectory, the standard DLL search path is:

  1. The directory from which the application loaded.
  2. The directory specified by the lpPathName parameter.
  3. The system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is System32.
  4. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System.
  5. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
  6. The directories that are listed in the PATH environment variable.

Each time the SetDllDirectory function is called, it replaces the directory specified in the previous SetDllDirectory call. To specify more than one directory, use theAddDllDirectory function and call LoadLibraryEx with LOAD_LIBRARY_SEARCH_USER_DIRS.

To revert to the standard search path used by LoadLibrary and LoadLibraryEx, call SetDllDirectory with NULL. This also restores safe DLL search mode based on theSafeDllSearchMode registry value.

To compile an application that uses this function, define _WIN32_WINNT as 0x0502 or later. For more information, see Using the Windows Headers.

posted @ 2012-06-27 22:58 Enic 閱讀(344) | 評論 (0)編輯 收藏

boost::implicit_cast

在stackoverflow上看到這個帖子, 于是發(fā)現(xiàn)了boost::implicit_cast這個小東西.

先來看看這段代碼:

struct top {};
struct mid_a : top {};
struct mid_b : top {};
struct bottom : mid_a, mid_b {};

void foo(mid_a&) {}
void foo(mid_b&) {}
void bar(bottom &arg) {
    foo(arg); // 想要調(diào)用"void foo(mid_a&)"
}

int main() {
    bottom x;
    bar(x);
    return 0;
}

是無法編譯通過的, 因為foo的重載解析有歧義. 那么把bar里的代碼改一改, 為了保持C++風格, 我們使用static_cast, 而不是C風格的轉(zhuǎn)換:

foo(static_cast<mid_a&>(arg));

程序編譯通過了, 運行起來也沒有問題, 然而…

一個月以后我把bar的參數(shù)類型修改了一下:

struct top {};
struct mid_a : top {};
struct mid_b : top {};
struct bottom : mid_a, mid_b {};

void foo(mid_a&) {}
void foo(mid_b&) {}
void bar(top &arg) {
    // ... 過了一個月, 這里已經(jīng)添加了很多代碼.
    foo(static_cast<mid_a&>(arg));
}

int main() {
    top x;
    bar(x);
    return 0;
}

代碼依舊編譯通過, 可是運行時程序掛掉了(假設(shè)這幾個類里面有許多成員, 并且在foo里對其進行了訪問).

發(fā)現(xiàn)問題了嗎? 原因就在于static_cast太強大了, 強大到可以進行”down-cast”. 于是編譯器沒有給你任何警告, 就把一個top類型的引用給強制轉(zhuǎn)換成了min_a的引用.

這個時候輪到boost::implicit_cast出場了. 把bar里面的那句foo調(diào)用改一改:

foo(boost::implicit_cast<mid_a&>(arg));

于是一個月前的代碼依舊可以通過編譯, 而一個月后的代碼中的錯誤被編譯器揪出來了. 原因在于隱式類型轉(zhuǎn)換不允許”down-cast”, 只能”up-cast”.

這里簡要說一下所謂顯式和隱式類型轉(zhuǎn)換的區(qū)別. 在C++世界的英文里, 我們說”convert”通常指”implicit convert”, 而”cast”指”explicit cast”. 隱式類型轉(zhuǎn)換好理解, 就是你寫了個a=b, 而ab不同類型, 編譯又不報錯, 就說明隱式類型轉(zhuǎn)換發(fā)生了, 類似的情況還有在函數(shù)調(diào)用的參數(shù)傳遞時. 而顯式類型轉(zhuǎn)換特指C風格的強制轉(zhuǎn)換((type)obj或者C++中等價的type(obj)), 以及C++風格的四個關(guān)鍵字(static_cast, const_cast, dynamic_cast, reinterpret_cast). 然而這個定義是相當模糊的, 比如一個int類型的x, bool(x)是顯式的, 而!!x是隱式的, 其實效果上并沒有區(qū)別, 只是字面上的不同罷了. (關(guān)于cast和convert的區(qū)別, 參見這里這里)

所以在bar里我們需要的僅僅是一個隱式類型轉(zhuǎn)換, 然而直接把arg傳遞給foo的話會出現(xiàn)重載歧義, 于是我們需要告訴編譯器到底要進行哪個隱式類型轉(zhuǎn)換. 然而static_cast又太過強大, 它還能做隱式類型轉(zhuǎn)換之外的事情(up-cast), 于是在日后代碼演化的過程中留下了bug.

于是boost::implicit_cast應運而生, 它比static_cast弱, 正如它的名字一樣, 它只能用來告訴編譯器執(zhí)行什么隱式類型轉(zhuǎn)換.

而它的代碼呢? 簡單到令人發(fā)指:

template <typename T>
inline T implicit_cast (typename mpl::identity<T>::type x) {
    return x;
}

而mpl::identity的定義也極其簡單:

template<typename T> struct identity { typedef T type; };

有人要問這個identity干什么用的, 看起來很累贅. 如果沒有這個identity, 像”implicit_cast(obj)”這樣的代碼也能通過編譯, 然而它其實什么也沒做, obj的類型仍然沒變. identity的存在使得函數(shù)模板的參數(shù)類型推導失效, 因為要推導出T, 首先得知道identity是什么, 而identity又是依賴于T的. 于是就形成了循環(huán)依賴, 參數(shù)類型推導就失效了. 于是編譯器就要求你顯式地指定T的類型.

posted @ 2012-06-23 21:34 Enic 閱讀(1701) | 評論 (1)編輯 收藏

    老早就想做這個事情了,想當初做協(xié)議代碼實現(xiàn)的時候那個揪心啊,各種重復的代碼一遍一遍的寫。后來發(fā)現(xiàn)了Google的Protobuf,初次看見真TMD驚艷,,,

    吐槽下,Google的開源項目都不怎么地道,基本都是開代碼不開文檔,或文檔少的可憐,,,

    在后來項目上要用到序列化技術(shù),而且我們的序列化工具類是鍵值對。何為鍵值對呢,,,囧,這個很難描述,先暫時記錄下我對序列化的理解。

 

//////////////////////////////////////////////////////////////////////////////////////////////

序列化一個抽象的概念,每個人可能理解都不同,我們約定這里談的序列是這個:

    序列化就是把一個語言成面上的依賴上下文的“對象”,變成一個精煉的語言、上下文無關(guān)的數(shù)據(jù)(可以是一塊內(nèi)存,可以是一坨文件等等任何數(shù)據(jù)的載體)的動作;

抽空百度了下,百度百科給出的解釋如下:

序列化 (serialization) 將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。

//////////////////////////////////////////////////////////////////////////////////////////////

 

題外話結(jié)束,繼續(xù)說我們項目上需求的鍵值對。

剛剛的穿插序列化定義理解中可以分析出:一個序列化的數(shù)據(jù)中除了包含有原始的“數(shù)據(jù)”信息應該還包含有“數(shù)據(jù)”的描述信息。一般的需求中這個描述信息只要包含有類型信息就好了。

    比如某個“對象”序列化以后數(shù)據(jù)信息是0x63,我去,,,鬼才能知道這是什么意思,是數(shù)字?字符?還是什么別的特殊的東西?

    所以需要描述信息。比如1表示是字符,2表示是int,3表示是系統(tǒng)內(nèi)部特定標識等等,,,

    這個偶們的鍵值對還是沒有任何關(guān)系? no no no,我們的鍵值對就是除了這個類型信息呢,還要加一個名字。偶們內(nèi)部的變量不僅是有類型的還是有名字的,,,也就是說描述信息中除了有類型還要有名字,,,

 

////////////////////////////////////////////////////////////////////////////////////////////

前幾天研究了下浮點怎么在網(wǎng)絡(luò)中傳輸。應為不同的機器或者不同的OS對浮點存儲方式是不同的。后來研究了下幾個開源的項目加上自己突然想起來大端小端int在網(wǎng)絡(luò)上的傳輸方式,突然發(fā)現(xiàn)這個問題沒有糾結(jié)的價值。標準嘛,大家統(tǒng)一標準就好了,誰的影響力大咱們就聽誰的,,,要擁抱世界,盡量成為一個兼容的標準。無法反抗,那就只能享受了吧,,,誰讓人家拳頭大,推廣好呢?

///////////////////////////////////////////////////////////////////////////////////////////

 

恩?剛剛上面不是主題,主題是這半個月要在不影響工作的前提下好好研究代碼生成技術(shù),其實這是為后面咱自己的序列化工具(類Google protobuf)打基礎(chǔ)哈,,,

叫啥名好呢?囧,,,但愿這次咱能堅持做出來,,,

posted @ 2012-06-23 21:01 Enic 閱讀(238) | 評論 (0)編輯 收藏

image

據(jù)說以前是支持的,現(xiàn)在是?

怕大伙都用工具搬家搬走了去了?

 

抱怨下,,,別無它意,,,囧啊,,,

posted @ 2012-06-23 00:38 Enic 閱讀(106) | 評論 (0)編輯 收藏

不在乎系統(tǒng)有多亂,而在乎能向前演進,棄糟粕,留精華。,,,
posted @ 2011-09-29 00:28 Enic 閱讀(96) | 評論 (0)編輯 收藏

這半年多時間陷入碼海,整天暈頭轉(zhuǎn)向,發(fā)現(xiàn)還是不行,每一套代碼都是不同的思想,而我總是追求完美,每套代碼都挑剔出各種毛病,,,

其實回頭看來,是方向錯了,我不是要研究別人做了什么,而是我要做什么然后去看看別人怎么做的,,,

真相再次,,,任何東西都不能脫離了需求,,,
posted @ 2011-07-06 18:17 Enic 閱讀(152) | 評論 (0)編輯 收藏

/*

    有兩個數(shù)組a,b,大小都為n,數(shù)組元素的值任意整形數(shù),無序;
    要求:通過交換a,b中的元素,使[數(shù)組a元素的和]與[數(shù)組b元素的和]之間的差最小。

*/

posted @ 2011-05-12 09:56 Enic 閱讀(710) | 評論 (0)編輯 收藏

僅列出標題
共22頁: First 14 15 16 17 18 19 20 21 22 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久色婷婷小香蕉久久| 欧美亚洲一区| 黄色精品免费| 亚洲一区免费网站| 亚洲免费观看高清完整版在线观看熊| 午夜宅男久久久| 亚洲图片在线观看| 欧美剧在线观看| 亚洲国产mv| 一区二区在线观看视频| 亚欧成人在线| 午夜精品区一区二区三| 欧美色综合天天久久综合精品| 欧美高清视频一区二区| 国产伦精品一区二区三| 在线亚洲欧美| 午夜精品久久久| 欧美日韩三级在线| 日韩亚洲视频| 亚洲午夜女主播在线直播| 欧美日韩理论| 夜夜躁日日躁狠狠久久88av| 一区二区日韩欧美| 欧美午夜电影网| 亚洲夜间福利| 欧美亚洲视频在线看网址| 国产精品美女黄网| 亚洲午夜视频在线观看| 香蕉久久一区二区不卡无毒影院 | 久久精品毛片| 久久久久久久久久久一区 | 欧美在线视频二区| 久久久精品999| 在线精品视频免费观看| 免费欧美网站| 99国产精品国产精品久久| 亚洲一区二区高清| 国产精品综合久久久| 久久精品二区三区| 欧美高清视频一区| 亚洲图片激情小说| 国产视频在线观看一区二区三区| 欧美一区国产在线| 欧美国产亚洲另类动漫| 午夜免费在线观看精品视频| 欧美在线999| 伊人一区二区三区久久精品| 蜜桃av综合| 99天天综合性| 久久久久久9| 亚洲精品一区二区三区av| 欧美午夜不卡视频| 欧美在线视频一区二区三区| 欧美国产一区二区| 亚洲男人天堂2024| 激情久久婷婷| 欧美色区777第一页| 久久国产免费| 99re66热这里只有精品4| 久久福利精品| 在线中文字幕不卡| 激情av一区| 欧美视频第二页| 久久亚洲国产成人| 一区二区三区日韩欧美| 欧美成人免费观看| 欧美伊人久久| 99精品国产一区二区青青牛奶| 国产色视频一区| 欧美日韩成人免费| 久久亚洲私人国产精品va| 在线视频精品一| 亚洲成人资源网| 久久精品国产精品| 亚洲视频一二| 亚洲黄色三级| 国产在线播放一区二区三区| 欧美日韩国产成人在线91| 久久精品最新地址| 亚洲欧美日韩国产成人精品影院| 亚洲激情精品| 欧美 日韩 国产一区二区在线视频 | 久久色在线观看| 亚洲一区二区欧美| 亚洲人成人99网站| 欧美不卡在线| 久久久精品2019中文字幕神马| 亚洲线精品一区二区三区八戒| 亚洲国产激情| 激情欧美丁香| 国产一区二区三区自拍| 国产精品一区二区三区乱码| 欧美日韩免费看| 欧美日本一区| 欧美肥婆在线| 欧美成人69| 免费亚洲一区二区| 美女亚洲精品| 欧美18av| 欧美久久视频| 欧美日韩成人一区| 欧美日韩国产限制| 欧美日韩一区二区三区四区在线观看| 欧美91大片| 欧美激情视频在线播放| 欧美暴力喷水在线| 欧美激情va永久在线播放| 欧美77777| 欧美日韩大片| 欧美日韩亚洲不卡| 国产精品豆花视频| 国产精品日韩久久久| 国产精品色婷婷| 国产日韩一区在线| 极品日韩av| 亚洲欧洲在线播放| 一本久道久久综合狠狠爱| 中文国产一区| 久久国产精品72免费观看| 久久久亚洲成人| 欧美电影打屁股sp| 亚洲精品在线三区| 亚洲一区图片| 久久久国产成人精品| 欧美jizz19性欧美| 欧美午夜精品理论片a级按摩| 国产精品一区二区在线| 国产一区二区丝袜高跟鞋图片| 今天的高清视频免费播放成人| 亚洲国产婷婷香蕉久久久久久| 日韩亚洲欧美中文三级| 亚洲欧美日韩人成在线播放| 久久久久久久综合日本| 欧美激情亚洲国产| 日韩亚洲精品电影| 欧美影院在线播放| 欧美精品不卡| 国产一级精品aaaaa看| 亚洲激情av在线| 亚洲欧美中文字幕| 免费日韩av片| 亚洲视频专区在线| 卡一卡二国产精品| 国产精品福利在线观看网址| 很黄很黄激情成人| 在线一区亚洲| 欧美不卡视频一区发布| 亚洲亚洲精品三区日韩精品在线视频| 久久精品免视看| 欧美午夜宅男影院| 亚洲国产乱码最新视频 | 在线视频亚洲| 久久这里只有| 亚洲视频免费在线观看| 免费人成精品欧美精品| 国产精品有限公司| 一区二区三区欧美视频| 免费欧美日韩国产三级电影| 中日韩美女免费视频网址在线观看| 久久免费一区| 国产日韩亚洲欧美综合| 在线视频亚洲欧美| 欧美激情成人在线| 欧美在线一二三区| 国产精品久久久亚洲一区| 日韩视频免费大全中文字幕| 久久综合导航| 西西裸体人体做爰大胆久久久| 欧美国产日韩一区二区在线观看| 国产亚洲激情| 欧美一区二区三区在线| 一区二区高清在线观看| 欧美激情一二区| 亚洲国产美女精品久久久久∴| 久久se精品一区二区| 亚洲天堂av图片| 欧美三级精品| 亚洲少妇自拍| 亚洲精品九九| 欧美激情国产日韩精品一区18| 136国产福利精品导航网址| 欧美在线视频网站| 午夜精品国产| 国产视频一区免费看| 性久久久久久久久| 亚洲午夜一区二区| 国产精品久久久久久五月尺| 亚洲图中文字幕| 在线视频一区二区| 国产精品久久久久久亚洲毛片| 亚洲天堂激情| 一本色道久久综合亚洲精品高清| 欧美日韩国产综合一区二区| 99热在这里有精品免费| 亚洲久久一区| 欧美色精品天天在线观看视频| 亚洲一级黄色片| 亚洲与欧洲av电影| 国产一区二区三区久久| 欧美.www|