最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2013年11月2日 星期六

直接Debug DLL

開發DLL時,Debug時可能會常使用印log的方法,但其實VC裡有可以直接Debug,不需要管使否有EXE的原始碼的方法,以下將介紹這樣的方法。
使用VC6建立一個名為MySum的MFC Extension DLL,並Key入如下程式碼:
MySum.cpp
#include "stdafx.h"
#include <afxdllx.h>

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

static AFX_EXTENSION_MODULE MySumDLL = { NULL, NULL };

void APIENTRY MySum(int a, int b)
{
 CTime t;
 printf("Time : %04d-%02d-%02d %02d:%02d:%02d\n", t.GetYear(), t.GetMonth(), t.GetDay(),t.GetHour(), t.GetMinute(), t.GetSecond());

 printf("a + b = %d\n", a + b);
}

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
 // Remove this if you use lpReserved
 UNREFERENCED_PARAMETER(lpReserved);

 if (dwReason == DLL_PROCESS_ATTACH)
 {
  TRACE0("MYSUM.DLL Initializing!\n");
  
  // Extension DLL one-time initialization
  if (!AfxInitExtensionModule(MySumDLL, hInstance))
   return 0;

  new CDynLinkLibrary(MySumDLL);
 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
  TRACE0("MYSUM.DLL Terminating!\n");
  // Terminate the library before destructors are called
  AfxTermExtensionModule(MySumDLL);
 }
 return 1;   // ok
}
MySum.def
; MySum.def : Declares the module parameters for the DLL.

LIBRARY      "MySum"
DESCRIPTION  'MySum Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here
 MySum @1

使用VC6建立一個名為TestSum的Application去呼叫MySum.dll,輸入以下代碼:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{ 
 typedef void (CALLBACK * _MySum) (int , int );
 HINSTANCE hLibModule; 
 _MySum MySum = NULL;

 hLibModule = LoadLibrary("MySum.dll");
 MySum = (_MySum) GetProcAddress(hLibModule, "MySum");
 if(MySum == NULL)
  return FALSE;

 MySum(15, 20);
 FreeLibrary(hLibModule);
 return TRUE;
}

設定MySum.dll的Project參數,點選工具列中Project/Settings:
1. 在Debug標籤頁,General選項下的"Executable for debug session"填入TestSum.exe所存在的絕對路徑(含EXE檔名)。

2. 在Link標籤頁,General選項下的"Output file name"填入MySum.dll要輸出至TestSum.exe所存在的資料夾絕對路徑(含DLL檔名)。

接下來只要在MySum.dll的Project中,設好需要Debug的中斷點位置就可以直接對DLL進行Debug。
執行結果:

沒有留言:

張貼留言