2012-03-03 53 views
-3

我誰做一些很酷的功能,處理加密和安全,他讓我在C++中的朋友叫由於@。然後,他用themidia使其更安全。themidia虛擬C++ DLL函數不能在名稱

他給我的DLL,我用一個函數查找器的所有功能。但這是問題。

所有功能有一個@符號在其中,當在C#中我使用了一個DLL重要的,它是在@語法錯誤它說不能編譯代碼。例如,一個函數名稱可能是「CheckPassword_ @ 12」,這很奇怪,但C#不會允許我這樣做。

有我丟失的東西,他不會給我一個不安全的DLL,因爲他不希望人們,如果他們破解我的應用程序能夠修改他的DLL。我檢查了多個應用程序,並做了我自己的東西,但所有的函數名都出現了@。

謝謝!

+0

的@ 12後綴表明他宣稱他與功能CallingConvention.StdCall。您可以從C#聲明中省略它。或使用ExactSpelling。如果它真的是一個虛擬的C++函數(簽名表示它不是),那麼你不能直接從C#調用它。 – 2012-03-03 20:59:15

+0

即使這樣,它仍然說錯誤。 [DllImport(「security.dll」,CallingConvention = CallingConvention.StdCall,ExactSpelling = true)] private static extern IntPtr _passwordValid @ 8(string string_0,string string_1); – 2012-03-03 21:14:06

回答

2
[DllImport("security.dll", CallingConvention=CallingConvention.StdCall, ExactSpelling=true)] 
private static extern IntPtr [email protected](string string_0, string string_1); 

這比您的問題更有意義。 StdCall調用約定在標識符之前放置下劃線,標識符後面爲@n。這個名字裝飾有助於在C程序中捕獲聲明錯誤。您只需省略它們,拼音編組器就可以反轉工程屬性導出名稱。 STDCALL是默認的,所以這是不夠好:

[DllImport("security.dll")] 
private static extern IntPtr passwordValid(string string_0, string string_1); 

順便說一句,我的意思是說入口點,而不是ExactSpelling在我的評論。

一個細節,你可能需要使用CharSet屬性的聲明。是否需要它取決於DLL作者使用的字符串類型。一個DLL編寫器通常也提供一個帶有函數聲明的.h文件。這樣的.h文件也會說passwordValid而不是[email protected]。確保你有合法的權利來使用這個DLL,而不是這樣的頭文件是非常不尋常的。