2011-12-09 25 views
0

我試圖代碼,使其GetProcessImageFileName來電VB6的應用程序,而是一個越來越...我在哪裏可以找到VB6中的GetProcessImageFileName?

Run-time error '453': 
    Can't find DLL entry point GetProcessImageFileName in PSAPI.DLL 

我給予理解它是在PSAPI.DLL被發現從文檔here

我的代碼看起來像......

Public Declare Function GetProcessImageFileName Lib "PSAPI.DLL" _ 
     (ByVal hProcess As Long, _ 
     lpImageName As String, _ 
     ByVal nSize As Long) As Long 

Public Sub MySub() 
Dim name_length As Long 
Dim image_name As String 
...fill in process handle... 
name_length = GetProcessImageFileName(process_handle, image_name, 1024) 

有誰知道我應該在這裏幹什麼? 我在Windows XP上運行。

編輯正如JosephH建議,我已經改變了代碼中使用GetProcessImageFileNameA,從而...

Public Declare Function GetProcessImageFileNameA Lib "PSAPI.DLL" _ 
     (ByVal hProcess As Long, _ 
     lpImageName As String, _ 
     ByVal nSize As Long) As Long 

name_length = GetProcessImageFileNameA(process_handle, image_name, 1024) 

這樣做(這是與W版本相同)導致程序和VB6開發環境崩潰,所以還有另一個問題隱藏在這裏。

+0

是'image_name'其實早就1024個字符?像這樣的API函數需要你創建一個字符串緩衝區來寫入。如果你對它撒謊,並說你傳遞了一個1024字節的字符串,事實並非如此,事情就會崩潰。 – Deanna

+0

@Deanna,謝謝你:我剛剛添加了'image_name = String(1024,「」)'在安全方面,但它仍然崩潰。 –

回答

4

它應該是GetProcessImageFileNameAGetProcessImageFileNameW。大多數Windows API函數(除GetProcAddress)接受字符串參數有兩個原型,一個用ANSI(與A後綴)和一個使用Unicode(與W後綴)

Public Declare Function GetProcessImageFileName Lib "PSAPI.DLL" Alias "GetProcessImageFileNameA" _ 
    (hProcess As Long, _ 
    ByVal lpImageName As String, _ 
    nSize As Long) As Long 

name_length = GetProcessImageFileNameA(process_handle, image_name, 1024) 
+1

在VB6中,傳遞字符串時,總是需要A版本。使用W版本意味着傳遞字符串指針並改變聲明。 – Deanna

+0

謝謝您的建議;我編輯了試用它的結果的問題。 –

+0

@BrianHooper我編輯了我的答案。現在試試。 – JosephH

相關問題