2013-01-18 27 views
0

我正在製作一個庫,它將執行操作以讀取進程內存,並從所述進程獲取信息。避免將不變的變量傳入庫

我遇到的問題是要調用函數,我必須每次都傳遞很多變量,即使它們的值沒有改變。

例如,ReadProcessMemory要求我通過:

  • 進程句柄
  • 存儲器地址
  • 主模塊基地址
  • 字節的數量來讀取

唯一這將改變爲每個閱讀是內存地址,所以我不需要通過其餘的每次我調用這個函數的變量(我實際上有3個函數可以用這種方式減少,而且可能會有更多的函數)。

任何人都可以給我一個簡要的解釋,我應該如何去做這件事?這些變量是否會在運行時存在,因此我可以直接調用該函數並直接從DLL文件中使用它們?

+0

我不明白這個問題;只需在函數調用中放置所有的值併爲內存地址提供一個變量即可。 – KevinDTimm

+0

你可以將它們作爲參數移除或使用默認參數嗎? –

+0

請注意,ProcessHandle對於每次調用都會有所不同(您不認爲它只會從一個程序中調用,是嗎?)。 – KevinDTimm

回答

2

您可以在使用可選參數調用方法時使用命名參數。

public void MyMethod(string s = null, int i = 0, MyType t = null) 
{ 
    /* body */ 
} 

調用它像這樣:

MyMethod(i: 10, t: new MyType()); 
MyMethod("abc"); 
MyMethod("abc", t: new MyType()); 

另外,您可以使用重載:

public void MyMethod(string s) 
{ 
    MyMethod(s, 0, null); 
} 
public void MyMethod(int i) 
{ 
    MyMethod(null, i, null); 
} 
public void MyMethod(MyType t) 
{ 
    MyMethod(null, 0, t); 
} 
public void MyMethod(string s = null, int i = 0, MyType t = null) 
{ 
    /* body */ 
} 

另一種選擇是使用一個參數類,像這樣:

public class MyParametersClass 
{ 
    public string s { get; set; } 
    public int i { get; set; } 
    public MyType t { get;set; } 

    public MyParametersClass() 
    { 
     // set defaults 
     s = null; 
     i = 0; 
     MyType = null; 
    } 
} 

public void MyMethod(MyParametersClass c) 
{ 
    /* body */ 
} 

這樣調用:

MyMethod(new MyParametersClass 
{ 
    i = 25, 
    t = new MyType() 
}); 

使用參數類可能是您的首選方法。參數類可以在您處理任何處理時隨身攜帶。 :)對它所做的任何更改都不會丟失...

var parameters = new MyParametersClass(); 
MyMethod(parameters); 
parameters.i = 26; 
MyMethod(parameters); 
+0

這幾乎就是我在尋找,但我不想傳遞的變量將在啓動時設置,這意味着每次程序運行時它們都不會相同。抱歉誤導你,謝謝你的迴應! – XtrmJosh

+0

{get;設置;}東西將允許我修改庫中的「全局變量」?這看起來就是我正在尋找的東西,如果是這樣的話!謝謝! – XtrmJosh

+0

由於某種原因,var似乎不存在?在你的文章中它的語法突出顯示,但在VS它不會!啊!在5.0版本中刪除了嗎? – XtrmJosh

1

一種方法是將方法調用轉換爲對象,並將參數緩存到此類對象中。叫做refactoring to "method object"

近似樣品(TX - 一些類型):

int My.ReadProcessMemory(T1 a1, T2 a2, T3 variable) 
{...} 


class ReadProcessMemory 
{ 
     T1 a1; 
     T2 a2; 
     public ReadProcessMemory(T1 a1, T2 a2) 
     { 
     this.a1 = a1; 
     this.a2 = a2; 
     } 
     public int Run(T3 variable) 
     { 
     return My.ReadProcessMemory(a1, a2, variable); 
     } 
} 
+0

這看起來像一個可能的答案,現在將調查它,謝謝。 – XtrmJosh

+0

@XtrmJosh,我已經添加了一些樣例,當你的情況有些參數改變而有些不改變時,你可以怎樣去解決這個重構問題。 –

+0

不完全遵循此解決方案,另一個已工作。感謝您的意見,爲了學習更多,我將着重於重構。乾杯(Y) – XtrmJosh

1

寫這個...設置變量作爲屬性或PARMS的「新事物(...)」的包裝類則隨後調用是thing.Read(MemoryAddress)

1

除了使用命名參數,您將需要存儲沒有在您的圖書館在某種程度上改變數值。

如果這些只是運行時變量,那麼你可以只使用類變量(如果你的庫是一個類)或靜態變量(如果沒有)。但是,這意味着您的庫正在存儲系統的狀態,並且必須驗證每次調用時狀態仍然有效。

要求在每個調用中傳遞的值實際上是一個非常乾淨的界面,並強制庫的用戶以一致的方式工作。