㈠ 在VC++中怎麼輸出十六進制源代碼
調試時,右鍵菜單選disseble
dll文件 新建選選倒數第二
㈡ 用vc6打開演示程序 運行可以正常運行 但是看不到源代碼 怎麼才能看到源代碼 源代碼被故意隱藏
你需要找到原始的項目文件夾,找到項目文件夾裡面有相應的代碼配置文件
㈢ VC 6.0的C語言庫函數的源代碼可以在哪找到
深入printf
/***
*printf.c - print formatted
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout ''PRINT'', ''F''ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);//斷言宏。如果輸出格式字元串指針為空,則在DEBUG版下斷言,報告錯誤。
_lock_str2(1, stdout);
buffing = _stbuf(stdout);//stdout:指定輸出到屏幕
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
_unlock_str2(1, stdout);
return(retval);
}
以上為printf()的源代碼
1、從含有可選參數函數中獲得可選參數,以及操作這些參數
typedef char *va_list;
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
假定函數含有一個必選參數和多個可選參數,必選參數聲明為普通數據類型,且能通過參數名來獲得該變數的值。可選參數通過宏va_start、va_arg和va_end(定義在stdarg.h或varargs.h中)來進行操作,即通過設置指向第一個可選參數指針、返回當前參數、在返回參數後重新設置指針來操作所有的可選參數。
va_start:為獲取可變數目參數的函數的參數提供一種便捷手段。設置arg_ptr為指向傳給函數參數列表中的第一個可選參數的指針,且該參數必須是va_list類型。prev_param是在參數列表中第一個可選參數前的必選參數。
va_arg:返回由arg_ptr所指向的參數的值,且自增指向下一個參數的地址。type為當前參數的類型,用來計算該參數的長度,確定下一個參數的起始位置。它可以在函數中應用多次,直到得到函數的所有參數為止,但必須在宏va_start後面調用。
va_end:在獲取所有的參數後,設置指針arg_ptr為NULL。
下面舉例說明:
#include
#include
int average( int first, ... );
void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
返回值為:
Average is: 3
Average is: 8
Average is: 0
綜上所述,在printf()函數中,可以只輸出一個字元串,也可按照一定的形式輸出含有多個可選參數的字元串信息。因此,首先就要通過這些宏來獲取所有的可選參數。在上面的源碼可以看出printf()中,只使用了宏at_start,將可選參數的首地址賦給了arglist。
2、鎖定字元串及輸出字元串到屏幕
#define _lock_str2(i,s) _lock_file2(i,s)
void __cdecl _lock_file2(int, void *);
#define _unlock_str2(i,s) _unlock_file2(i,s)
void __cdecl _unlock_file2(int, void *);
int __cdecl _stbuf(FILE *);
void __cdecl _ftbuf(int, FILE *);
int __cdecl _output(FILE *, const char *, va_list);
在output函數中,讀取格式字元串中的每一個字元,然後對其進行處理,處理方式根據每一個字元所代表的意義來進行,如:普通字元直接利用函數WRITE_CHAR(ch, &charsout);輸出到控制台。
其中的主要部分是對轉換說明符(d,c,s,f)的處理,現在將對其中的部分代碼進行詳細說明,這里只說明最基本的轉換說明符,對這些須基本的轉換說明符進行修飾的修飾符,程序中單獨進行處理。下面是函數output()(output.c)部分源代碼:
case ST_TYPE:
//表示當前處理的字元的類型為轉換說明符。
...
switch (ch) {
//下面對參數的獲取都是利用宏va_arg( va_list arg_ptr, type );來進行的。
case ''c'': {
//從參數表中獲取單個字元,輸出到緩沖字元串中,此時,type=int
buffer[0] = (char) get_int_arg(&argptr); /* get char to print */
text = buffer;
textlen = 1; /* print just a single character */
}
break;
case ''s'': {
//從參數表中獲取字元串,輸出到緩沖字元串中,此時,type=char*
int i;
char *p; /* temps */
text = get_ptr_arg(&argptr);
...
}
break;
case ''w'': {
//對寬字元進行處理
...
} /* case ''w'' */
break;
...
case ''e'':
case ''f'':
case ''g'': {
//對浮點數進行操作
...
#if !LONGDOUBLE_IS_DOUBLE
/* do the conversion */
if (flags & FL_LONGDOUBLE) {
_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, LONGDOUBLE);
//對長雙精度型進行處理,此時,type=long double
}
else
#endif /* !LONGDOUBLE_IS_DOUBLE */
{
//對雙精度型進行處理,此時,type=double
_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, DOUBLE);
}
...
break;
//對整型變數處理
case ''d'':
case ''i'':
...
goto COMMON_INT;
case ''u'':
radix = 10;
goto COMMON_INT;
case ''p'':
...
goto COMMON_INT;
case ''o'':
...
註:對於浮點型double和long double,有相應的轉換說明符(%f表示雙精度型,%lf表示長雙精度型),而float卻沒有。其中的原因是,在K&RC下,float值用於表達式或用作參數前,會自動轉換成double類型。而ANSI C一般不會自動把float轉換成double。有些程序已假定其中的float參數會被轉換成double,為了保護大量這樣的程序,所有printf()函數的float參數還是被自動轉換成double型。因此,在K&RC或ANSI C下,都無需用特定的轉換說明符來顯示float型。
綜上所述,轉換說明符必須與待列印字元的類型。通常,用戶有種選擇。例如,如要列印一個int類型的值。則只可以使用%d,%x或%o。所有這些說明符都表示要列印一個int類型的值;它們只不過提供了一個數值的幾種不同表示。類似一,可以用%f、%g和%e來表示double類型的值。但如果轉換說明與類型不匹配,將會出現意想不到的結果。為什麼呢?問題就在於C向函數傳遞信息的方式。
這個失敗的根本細節與具體實現相關。它決定了系統中的參數以何方式傳遞。函數調用如下:
float n1;
double n2;
long n3;
long n4;
...
printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);
這個調用告訴計算機,要把變數n1,n2,n3和n4的值交給計算機,它把這些變數放進稱作棧(stack)的內存區域中,來完成這一任務。計算機把這些值放進棧中,其根據是變數的類型而不是轉換說明符,比如n1,把8個位元組放入棧中(float被轉換成double),類似地,為n2放了8位元組,其後給n3和n4各放了4個位元組。接著,控制的對象轉移到printf();此函數從棧中讀數,不過在這一過程中,它是在轉換說明符的指導下,讀取數值的。說明符%ld指定printf()應讀4個位元組(va_arg( va_list arg_ptr, type )中type=long),因此printf()讀入棧中的4個位元組,作為它的第一個值。但是這只是n1的前半部分,這個值被看成一個long整數。下一個說明符%ld讀入4個位元組,這正是n1的後半部分,這個值被看成第二個long整數。類似地,第三、第四次又讀入n2的前後兩部分。因此,盡管我們對n3和n4使用了正確的說明符,printf()仍然會產生錯誤。
這里也可以下載
http://mirrors.kernel.org/gnu/glibc/glibc-2.7.tar.gz
㈣ VC6編譯源代碼成功時是提示什麼的,我的怎麼老是提示0 error,0warning,如果編譯成OBJ文件後又怎麼連接
將源碼變成可執行文件有兩布要做.
第一步是編譯.就是將源代碼編譯為obj二進制文件.
第二部就是將所有的obj文件,引用的庫文件一起.鏈接成為可執行文件.
所以你就是沒有鏈接.僅僅只編譯了.
VC6裡面按F7就能鏈接了.鏈接成功後你就會看到exe文件了.
㈤ 在vc6.0中怎樣使源代碼生成.exe文件
右上面的第一個是compile 編譯連接 快捷鍵是 ctrl+F7
第二個是 build 組建工程 快捷鍵是F7
第四個是個感嘆號,那個就能生成一個.exe可執行文件。快捷鍵是ctrl+F5
㈥ VC6 怎麼調用資源圖片 有源碼
你是指VC6建的控制台程序里要顯示BMP格式的圖片吧。這個還真的幫不了你。圖片的載入是需要有載體的,例如你建的對話框,按鈕等。 但是cmd.exe並非你的程序生成的,作不了載體。我也學習學習不知道到哪個大神有辦法呀!~
㈦ 用vc6.0編譯出的exe如何提取源代碼
打開VC6,File——Open
Workspace...(就是打開項目工程),在對話框里找到你那工程文件夾,看看有沒有dsw的文件,打開就可以了,文件再多也沒關系,程序文件和頭文件都分好的,說白了就是教你怎麼用VC6打開一個工程,更簡單的話直接雙擊dsw文件,VC6自動開工程...
其實不一定要有dsw,有源碼直接去看好了,幹嘛還非得整一個工程
如果連源碼都沒有,你只是需要一部分功能,那看匯編逆出來不就行了
㈧ 為什麼我的vc6.0的sizeof(int)結果錯誤,源代碼如下
你把sizeof(int)放引號里當然不對,它根本不做計算。你這里列印一個非常大的數是因為printf沒有%d對應的參數,列印的是隨機數
改成
printf("%d", sizeof(int));
㈨ VC++6.0下基於對話框的列印功能實現
使用資料庫讀取出數據來以後直接自己寫列印的代碼就可以了啊
我以前做過一個相似功能的先從資料庫里讀取數據填充了列表框控制項然後調用了我自己寫的一個函數列印這個列表框中的所有數據
根據你現在的貼圖假設點擊列印按鈕的時候列表框里已經被你通過訪問資料庫填充進了數據,那麼就是從該列表框中獲取數據按順序列印就可以了。以下這個函數基本就能實現這個需求。
//列印列表
void PrintList(CListCtrl &listCtrl)
{
if(!listCtrl.GetItemCount())
{
AfxMessageBox("沒有數據可以列印");
return;
}
// 建立列印對話框對象
CPrintDialog
d1(FALSE,PD_ALLPAGES|PD_ALLPAGES|PD_NOPAGENUMS,NULL);
HDC dc1;
DOCINFO di={sizeof(DOCINFO),printName,NULL};
if(d1.DoModal()==IDOK)
{
// 返回一個列印DC句柄
dc1=d1.GetPrinterDC();
CDC testDC;
testDC.Attach(dc1);
testDC.SetBkMode(TRANSPARENT);
int nListItem = listCtrl.GetItemCount(),//需要列印多少條目
nListColumn =
((CHeaderCtrl*)listCtrl.GetHeaderCtrl())->GetItemCount(),//列數
nPageNeedPrint = nListItem/70 + ((nListItem%70) ? 1 : 0),//需要列印的頁數
nPageCount = 0, //已列印的頁數
nCount = 0, //已列印條目的計數
nItemPerPage = 0; //每頁應該列印的條目數
//列表框寬度,用於計算比例
int nHeaderWidth = 0;
for (int k=0;k<nListColumn;k++)
{
nHeaderWidth += listCtrl.GetColumnWidth(k);
}
// 獲取列印設備橫、縱坐標像素值
int xHor = testDC.GetDeviceCaps(HORZRES);
int yVer = testDC.GetDeviceCaps(VERTRES);
int nStepX = xHor/25, nStepY = yVer/80;
// 啟動列印工作
StartDoc(dc1,&di);
while(nPageCount < nPageNeedPrint)
{
// 一頁開始
StartPage(dc1);
///////////////////////////////////////////////////
//具體的針對參數listCtrl的列印操作
//就類似dc繪圖輸出文字一樣,根據需求輸出即可
// 一頁結束
EndPage(dc1);
nPageCount++;
}
// 終止列印工作
EndDoc(dc1);
// 刪除句柄
if(DeleteDC(dc1))
{
return;
}
else
{
//出錯信息
EndDoc(dc1);
// 刪除句柄
if(DeleteDC(dc1))
{
return;
}
else
{
//出錯信息
}
}
}
}