2012-12-17 135 views
2

我創建了我自己的dll,它公開了一種實用方法,即GenarateID。頭文件看起來像這樣:NSIS System :: Call - 未能調用方法

#ifndef GENERATE_ID_H 
#define GENERATE_ID_H 

#include <windows.h> 
#include <string> 
#include <fstream> 
#include <stdio.h> 
#include "openssl/sha.h" 

int __declspec(dllexport) GenerateID(const char* fileName, char* retVal); 

// some additional helper methods declared here, but omitted for brevity 
// ... 

#endif // GENERATE_ID_H 

這種方法做什麼?
它讀取作爲第一個參數傳遞的二進制文件,獲取一些數據,生成該數據的SHA256哈希,並通過第二個參數返回它。成功時,返回的int值爲0,否則爲負值。有一點值得一提的是我用OpessSSL庫來達到這個目的。

現在,這裏是問題的起點。正如標題所說,我無法使用System::Call從NSIS調用我的dll。 (我創建簡單的控制檯測試可執行文件,調用,沒有任何問題庫)。

這裏是我試過的基礎上,this short tutorial

# copy the files 
SetOutPath $INSTDIR 
SetOverwrite on 
File C:\Users\Strahinja\Desktop\CRX\testfile.zip # copy the binary 
File C:\OpenSSL-Win32\libeay32.dll    # copy OpenSSL library 
File C:\Users\Strahinja\Desktop\CRX\IDGenerator\Release\IDGenerator.dll # copy my dll 

# generate id 
StrCpy $R0 "testfile.zip" 
StrCpy $R1 ${NSIS_MAX_STRLEN} ;assign memory to out parameter ? 
StrCpy $R2 -1 
#System::Call 'IDGenerator::GenerateID(t, t)i (r10, .r11).r12' 
System::Call 'IDGenerator::GenerateID(t r10,t .r11)i.r12' 
DetailPrint "File parameter: $R0" 
DetailPrint "Generated ID: $R1" 
DetailPrint "Return value: $R2" 

NSIS說,返回值是error。有沒有辦法來檢查錯誤是什麼,更重要的是 - 我使用這個權利?

作爲一個方面說明:我試圖用一個exe代替dll,以同樣的方式與將其複製到同一目錄作爲dll,並調用它:

nsExec::ExecToStack '"myidgen.exe"' 
Pop $R2 
Pop $R1 

可執行這裏工作正常,但我仍然會喜歡dll。 我感覺到它可能與呼叫約定有關,或者dllexport(因爲它使用名稱混合,AFAIK)
有什麼建議嗎?

回答

1

錯誤通常意味着語法錯誤,但也可能意味着LoadLibrary或GetProcAddress失敗。使用Dependency Walker來檢查導出的函數是否有裝飾名稱。

您可能想使用DEF文件導出該函數。

如果使用EXTERN_C int __cdecl __declspec(dllexport) foo()還應該沒有裝修出口,但那麼你就需要追加?c系統調用結束...

+0

可以擴大使用DEF文件的想法一點點?我不是一個C++的傢伙,所以一個例子會很好,它應該在解決方案中應該去哪裏,我需要在構建過程中以某種方式「包含」它?那麼我怎樣才能調用函數(按序號?)? – Less

+0

如果您使用的是Visual Studio,您可以在MSDN上找到您需要的信息... – Anders

+0

已經做了:)謝謝反正 – Less

相關問題