程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VBA調用C/C++ DLL

VBA調用C/C++ DLL

編輯:C++入門知識

 

在VBA開發過程中,為了能夠使用系統已經提供的函數,或已經用C++語言開發的功能,本文對VBA調用C++ DLL進行了總結。

 

1.        函數聲明

 

Function prototype:

 

DWORD WINAPI GetCurrentDirectory(

 

 __in   DWORD nBufferLength,

 

 __out  LPTSTR lpBuffer

 

);

 

函數聲明如下:

 

Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long

 

Public  用於聲明對所有模塊中的所有其它過程都可以使用的函數。  Private   用於聲明只能在包含該聲明的模塊中使用的函數。 

 

Lib包含所聲明函數的動態鏈接庫名或代碼資源名。   

 

Alias 表示將被調用的函數在動態鏈接庫(DLL)   中還有另外的名稱。

 

 

 

2.        DLL的位置

 

DLL文件必須位於以下三個目錄之一:

 

(1)Windows的系統目錄:\Windows\system32

 

(2)DOS中path所指出的任何目錄

 

(3)Windows XP系統下:C:\Documentsand Settings\%USERNAME%\My Documents

 

為了VBA可以調用DLL中的函數,必須把DLL放在以上三個位置中的任何一個。

 

有兩種辦法可以解決這個問題:

 

1.      在調用DLL 函數之前,把DLL copy到以上三個目錄中的任何一個。

 

Dim fso AsObject

 

Dim dllFileNameAs String

 

dllFileName = Environ("SYSTEMROOT")+ “\system32\LicenseVerify.dll”

 

Set fso =CreateObject("Scripting.FileSystemObject")

 

Iffso.FileExists(dllFileName) = False Then

 

fso. CopyFile ThisWorkbook.Path + “\ LicenseVerify.dll”,dllFileName

 

End If

 

 

 

2.      改變當前進程的當前路徑。

 

例如,DLL與當前EXCEL文件放在同一個目錄下,這個時候當前進程的當前路徑設置如下:

 

Public Declare Function SetCurrentDirectoryLib "kernel32" Alias "SetCurrentDirectoryA" (ByVallpPathName As String) As Long ‘ function declaration

 

SetCurrentDirectory (ThisWorkbook.Path) ‘set the current directory to Thisworkbook.Path

 

OK,這樣設置後,就可以訪問DLL了。這樣方便程序的發布,不需要用戶把DLL復制到系統目錄下。

 

 

 

3.        返回值

 

如果返回值是字符串,需要在函數調用前為字符串分配內存空間。

 

Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long

 

其中,lpBuffer 是輸出參數。

 

例子:

 

Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long

 

 

 

Private Sub DoVerify()

 

    Dimresult As Integer

 

    Dim retValue AsString

 

 

 

    retValue = String(1024, vbNullChar) 'allocate the buffer for out parameter.

 

 

    result= GetCurrentDirectory(1024, retValue)   

 

End Sub

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