線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1671
推到 Plurk!
推到 Facebook!

如何使用(呼叫?)VC的函式

尚未結案
cceCKF
一般會員


發表:13
回覆:13
積分:5
註冊:2004-04-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-15 18:51:17 IP:220.132.xxx.xxx 未訂閱
因為要使用MD5來產生digest作為認證之用,所以參考RFC2617所提供的範例,在VC環境下可以順利的運作,但是我將這些c的source code以Project -> Add to project加進BCB專案後,呼叫其函式還是會出現"[Linker Error] Unresolved external'函式名稱'"的錯誤,參考了站上有關於這個錯誤的文章,大部分都是說函式沒有定義,但是我是想直接引用外部程式的函式(這樣描述不知道正不正確?),還是一定得在BCB裡面重新定義才能夠使用呢?    我把相關檔案放在發問區: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=76823    謝謝各位先進指教 -- 我想多學一點 發表人 -
------
我想多學一點
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-15 20:42:27 IP:211.22.xxx.xxx 未訂閱
函數宣告是為了要讓COMPILER做型態檢查,就像變數一樣,沒有先宣告就不能使用,將檔案包含進專案了,只是告知COMPILER有這些檔案組成程式,COMPILER只會依照順序編譯,所以有可能發生先編譯的程式呼叫還沒被編譯到的程式,就會有上述錯誤發生。 另外C++呼叫C寫的函數,在C的標頭檔函數宣告前後要加上以下範例作法(以MD5部分CODE為例),忘了是啥原因,好像是CALLING CONVENTION不同! < class="code"> #if defined(__cplusplus) extern "C" { #endif /* MD5 context. */ typedef struct { UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */ } MD5_CTX; void MD5Init PROTO_LIST ((MD5_CTX *)); void MD5Update PROTO_LIST ((MD5_CTX *, unsigned char *, unsigned int)); void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *)); #if defined(__cplusplus) } #endif ---------------------------------------------- We will either find a way, or make one. -Hannibal -。 發表人 - stallion 於 2005/08/15 20:43:16
cceCKF
一般會員


發表:13
回覆:13
積分:5
註冊:2004-04-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-15 23:39:08 IP:220.132.xxx.xxx 未訂閱
引言: 函數宣告是為了要讓COMPILER做型態檢查,就像變數一樣,沒有先宣告就不能使用,將檔案包含進專案了,只是告知COMPILER有這些檔案組成程式,COMPILER只會依照順序編譯,所以有可能發生先編譯的程式呼叫還沒被編譯到的程式,就會有上述錯誤發生。 請問這部份該如何解決呢? 另外C++呼叫C寫的函數,在C的標頭檔函數宣告前後要加上以下範例作法(以MD5部分CODE為例),忘了是啥原因,好像是CALLING CONVENTION不同! < class="code"> #if defined(__cplusplus) extern "C" { #endif /* MD5 context. */ typedef struct { UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */ } MD5_CTX; void MD5Init PROTO_LIST ((MD5_CTX *)); void MD5Update PROTO_LIST ((MD5_CTX *, unsigned char *, unsigned int)); void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *)); #if defined(__cplusplus) } #endif ---------------------------------------------- We will either find a way, or make one. -Hannibal -。 發表人 - stallion 於 2005/08/15 20:43:16
先謝謝Stallion大大的回覆。小弟我試著把md5的部分直接加進BCB,header放到專案的.h檔裡面,主程式的部份如下:
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "auth.h"    #include 
#include     #include 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;    #if defined(__cplusplus)
extern "C"
{
#endif
void CvtHex(
    IN HASH Bin,
    OUT HASHHEX Hex
    )
{
    unsigned short i;
    unsigned char j;        for (i = 0; i < HASHLEN; i  ) {
        j = (Bin[i] >> 4) & 0xf;
        if (j <= 9)
            Hex[i*2] = (j   '0');
         else
            Hex[i*2] = (j   'a' - 10);
        j = Bin[i] & 0xf;
        if (j <= 9)
            Hex[i*2 1] = (j   '0');
         else
            Hex[i*2 1] = (j   'a' - 10);
    };
    Hex[HASHHEXLEN] = '\0';
};    /* calculate H(A1) as per spec */
void DigestCalcHA1(
    IN char * pszAlg,
    IN char * pszUserName,
    IN char * pszRealm,
    IN char * pszPassword,
    IN char * pszNonce,
    IN char * pszCNonce,
    OUT HASHHEX SessionKey
    )
{
      MD5_CTX Md5Ctx;
      HASH HA1;          MD5Init(&Md5Ctx);
      MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName));
      MD5Update(&Md5Ctx, ":", 1);
      MD5Update(&Md5Ctx, pszRealm, strlen(pszRealm));
      MD5Update(&Md5Ctx, ":", 1);
      MD5Update(&Md5Ctx, pszPassword, strlen(pszPassword));
      MD5Final(HA1, &Md5Ctx);
      if (stricmp(pszAlg, "md5-sess") == 0) {                MD5Init(&Md5Ctx);
            MD5Update(&Md5Ctx, HA1, HASHLEN);
            MD5Update(&Md5Ctx, ":", 1);
            MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
            MD5Update(&Md5Ctx, ":", 1);
            MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
            MD5Final(HA1, &Md5Ctx);
      };
      CvtHex(HA1, SessionKey);
};    /* calculate request-digest/response-digest as per HTTP Digest spec */
void DigestCalcResponse(
    IN HASHHEX HA1,           /* H(A1) */
    IN char * pszNonce,       /* nonce from server */
    IN char * pszNonceCount,  /* 8 hex digits */
    IN char * pszCNonce,      /* client nonce */
    IN char * pszQop,         /* qop-value: "", "auth", "auth-int" */
    IN char * pszMethod,      /* method from the request */
    IN char * pszDigestUri,   /* requested URL */
    IN HASHHEX HEntity,       /* H(entity body) if qop="auth-int" */
    OUT HASHHEX Response      /* request-digest or response-digest */
    )
{
      MD5_CTX Md5Ctx;
      HASH HA2;
      HASH RespHash;
       HASHHEX HA2Hex;          // calculate H(A2)
      MD5Init(&Md5Ctx);
      MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod));
      MD5Update(&Md5Ctx, ":", 1);
      MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri));
      if (stricmp(pszQop, "auth-int") == 0) {
            MD5Update(&Md5Ctx, ":", 1);
            MD5Update(&Md5Ctx, HEntity, HASHHEXLEN);
      };
      MD5Final(HA2, &Md5Ctx);
       CvtHex(HA2, HA2Hex);          // calculate response
      MD5Init(&Md5Ctx);
      MD5Update(&Md5Ctx, HA1, HASHHEXLEN);
      MD5Update(&Md5Ctx, ":", 1);
      MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
      MD5Update(&Md5Ctx, ":", 1);
      if (*pszQop) {              MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount));
          MD5Update(&Md5Ctx, ":", 1);
          MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
          MD5Update(&Md5Ctx, ":", 1);
          MD5Update(&Md5Ctx, pszQop, strlen(pszQop));
          MD5Update(&Md5Ctx, ":", 1);
      };
      MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN);
      MD5Final(RespHash, &Md5Ctx);
      CvtHex(RespHash, Response);
};
#if defined(__cplusplus)
}
#endif
雖然沒有Linker Error的錯誤發生,但是在compile時產生許多Extra Parameter in call to MD5Init()的錯誤(只要是MD5Init, MD5Update, MD5Final都有),請問這是什麼情況呢? 我也已經加入了Stallion大您所提到的部分.. -- 我想多學一點 發表人 -
------
我想多學一點
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-16 19:09:28 IP:59.115.xxx.xxx 未訂閱
cceCKF 您好:    bruce0211 版主在使用 MD5 時,似乎有過一段 "火大" 的心路歷程,後來自己整理了一些資料後,直接將它寫成了副程式,而且是寫了 BCB 與 Delphi 兩個版本,您不妨參考一下 BCB 的那個部份,因為是直接使用 BCB 所撰寫的,因此不會有相容性的問題: 心得分享系列(BCB) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=18760 請查看上述連結頁面中的最後方,於 2005/08/08 發表的那一篇。 7 天天敲鍵盤 v 時時按滑鼠 8
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-16 19:59:53 IP:211.22.xxx.xxx 未訂閱
1.
引言:函數宣告是為了要讓COMPILER做型態檢查,就像變數一樣,沒有先宣告就不能使用,將檔案包含進專案了,只是告知COMPILER有這些檔案組成程式,COMPILER只會依照順序編譯,所以有可能發生先編譯的程式呼叫還沒被編譯到的程式,就會有上述錯誤發生。請問這部份該如何解決呢?
答案很簡單,就是在呼叫的檔案中,先行INCLUDE該函數的原型檔案(就是標頭檔),讓COMPILER知道可能還沒被編譯到的檔案中該函數的樣子外貌啦。 2.cceCKF有點誤會我的意思~ 我所加入的那幾句前置處理器語法,是用在標頭檔,而不是程式碼中。 ----------------------------------------------
cceCKF
一般會員


發表:13
回覆:13
積分:5
註冊:2004-04-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-17 11:43:11 IP:61.31.xxx.xxx 未訂閱
引言: cceCKF 您好: bruce0211 版主在使用 MD5 時,似乎有過一段 "火大" 的心路歷程,後來自己整理了一些資料後,直接將它寫成了副程式,而且是寫了 BCB 與 Delphi 兩個版本,您不妨參考一下 BCB 的那個部份,因為是直接使用 BCB 所撰寫的,因此不會有相容性的問題: 心得分享系列(BCB) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=18760 請查看上述連結頁面中的最後方,於 2005/08/08 發表的那一篇。 7 天天敲鍵盤 v 時時按滑鼠 8
謝謝RedSnow大的回覆, 這篇文章我有看過, 目前正對照bruce0211版主撰寫的程式哪些部分與RFC 1321裡面的MD5Init()、MD5Update()、MD5Final()相同, 因為這三個函式放到bcb後compile有error, 現在大概只能靠bruce0211版主所寫的程式來重寫一個Http digest authenticate的程式了.. -- 我想多學一點
------
我想多學一點
cceCKF
一般會員


發表:13
回覆:13
積分:5
註冊:2004-04-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-18 12:20:41 IP:220.132.xxx.xxx 未訂閱
引言: 1.
引言:函數宣告是為了要讓COMPILER做型態檢查,就像變數一樣,沒有先宣告就不能使用,將檔案包含進專案了,只是告知COMPILER有這些檔案組成程式,COMPILER只會依照順序編譯,所以有可能發生先編譯的程式呼叫還沒被編譯到的程式,就會有上述錯誤發生。請問這部份該如何解決呢?
答案很簡單,就是在呼叫的檔案中,先行INCLUDE該函數的原型檔案(就是標頭檔),讓COMPILER知道可能還沒被編譯到的檔案中該函數的樣子外貌啦。 嗯..這點我有做到, 但還是沒辦法]< > > 我所加入的那幾句前置處理器語法,是用在標頭檔,而不是程式碼中。 <>我真是太淺了< > ---------------------------------------------- > 我參考了下面的討論, 原po最後還是把C的部分直接加到*.cpp裡面, 直接share給bcb使用似乎還是不可行?? 但我有更嚴重的問題, 就是放到*.cpp裡面竟然出現[C Error]..也許是語法上的問題吧?!
------
我想多學一點
系統時間:2024-05-06 1:37:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!