程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 創建“通用的”動態鏈接庫(DLL)

創建“通用的”動態鏈接庫(DLL)

編輯:關於VC++

最近有許多人問如何讓動態鏈接庫的輸出函數能夠被任何支持動態鏈接庫的語言調用。寫動態鏈接庫是很EASY的事情。但是,他們大多覺得輸出的名字有亂字符(如:_vbShiftRight@1)。我想在這裡就討論一下如何讓輸出函數的名字中不出現亂子符。

首先,除非你絕對需要使用C++編碼,否則我還是推薦使用C來寫DLL。這裡我想讓創建的DLL可以在VB中使用。

你需要實現自己DLL的入口點函數和保證代碼使用stdcall調用規范,但這要依賴你使用的編譯器。例如,你可以在VC中使用“/entry:"DLLEntry"”命令行編譯選項來創建自己的入口點。“DLLEntry” 可以參考下列代碼:

/////////////////////////////////////////////////////////////////////
// DLL initialization and clean-up.
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
  switch(fdwReason) {
   case DLL_PROCESS_ATTACH:
     // Perform any DLL initialization here
     break;
   case DLL_PROCESS_DETACH:
     // Perform any DLL cleanup here
     break;
  }
  return TRUE;
}

為了保證你使用正確的調用規范,要通知編譯器使用stdcall規范和/或使用在windows.h(及相關文件)中定義的常量,如WINAPI等。通常DLL的代碼如下:

/////////////////////////////////////////////////////////////////////
// Shifts bits right for integers.
WORD WINAPI vbShiftRight(WORD nValue, WORD nBits)
{
  return (nValue >> nBits);
}

下一步是與你在微軟文檔中讀到的內容相反。你需要創建一個DEF文件。這是你防止輸出函數名不出現亂字符的唯一方式(如_vbShiftRight@1)。DEF文件的形式如下:

EXPORTS

vbShiftRight

下一步是在VB中調用這個函數,使用以下聲明:

Declare Function vbShiftRight Lib "MYDLL.DLL" (ByVal nValue As Integer,
 ByVal nBits As Integer)
As Integer
Sub Test()
  Dim i As Integer
  i = vbShiftRight(4, 2)
  Debug.Assert i = 1
End Sub

如果你還想要更容易的方法從VB中調用,可以創建一個類型庫。為此你需要創建和編譯ODL(對象描述語言)文件。這個文件應該包含如下內容:

module MyModule {
  [
   helpstring("Shifts the bits of an integer to the right."),
   entry("vbShiftRight")
  ]
  short _stdcall vbShiftRight([in] short nValue, [in] short nBits);
};

當VB加載DLL的類型庫時,函數名和參數將出現在VB的對象浏覽器中。此外,如果用戶不輸入正確的參數類型,VB將產生一個錯誤。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved