2012-07-11 82 views
3

我做了一个非常简单的NSIS插件,它有一个功能。我已经成功编译的Win32 DLL项目成DLL然后将其复制到该目录C:\ Program Files文件(x86)的\ NSIS \插件NSIS插件功能不被识别

我的问题:当我创建.nsi脚本调用一个函数从DLL我得到一个编译错误说无效的命令:tbox :: myFunction

我做错了什么? 我是否需要将tbox.lib文件复制到NSIS目录并创建tbox.nsh文件以包含?

我的DLL的名字是tbox.dll,我NSI脚本如下再下面是我的C++ DLL代码:

!include MUI2.nsh 
    !include WinMessages.nsh 

    Name "aa.nsi" 
    OutFile "aa.exe" 
    Caption "${^Name}" 
    ShowInstDetails show 
    !define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit 

    Section "Dummy" 
     MessageBox MB_ICONINFORMATION|MB_OKCANCEL "dvkjdkj" 
     tbox::myFunction "abc" "def" 
    SectionEnd 

DLL代码:

#include "targetver.h" 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 

#include <stdlib.h> 
#include <malloc.h> 
#include <memory.h> 
#include <tchar.h> 
#pragma comment(lib, "msimg32.lib") 
#include <commctrl.h> 
#include "TransparentCheckbox.h" 
#include "NSIS/pluginapi.h" 

HINSTANCE g_hInstance; 
HWND g_hwndParent; 
unsigned int g_stringsize; 
stack_t **g_stacktop; 
TCHAR *g_variables; 

// To work with Unicode version of NSIS, please use TCHAR-type functions for accessing the variables and the stack. 
HWND __declspec(dllexport) myFunction(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) 
{ 
    g_hwndParent=hwndParent; 
    EXDLL_INIT(); 

    { 
    TCHAR buf[1024]; 
    wsprintf(buf,TEXT("string_size=%d, variables=%s\n"), string_size, variables); 
    MessageBox(g_hwndParent,buf,0,MB_OK); 
    } 

    return g_hwndParent; 
} 

BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) 
{ 
    g_hInstance = (HINSTANCE)hInst; 
    return TRUE; 
} 
+0

你能看到的导出函数从其他工具,如取决于? – leppie 2012-07-11 05:31:08

+0

@leppie yes我可以看到函数和它的名字,但由于某种原因它有点奇怪吗?myFunction @@ YAPAUHWND __ @@ PAU1 @ HPADPAPAU_stack_t @@ PAUextra_parameters @@@ Z – 2012-07-11 06:26:12

+0

您需要将它导出为C函数。给出的答案是正确的。使用'extern“C”'。 – leppie 2012-07-11 08:05:23

回答

6

Makensis列出了所有的插件和他们的在编译时导出函数。

如果您的插件没有列出,那么它不在正确的目录中或根本没有导出。如果已列出,但名称错误(tbox::_myFunctiontbox::[email protected]),则表明您有装饰问题。你可以尝试extern "C" HWND __declspec(dllexport) __cdecl myFunction(...,如果这还不够,你可能需要一个.def文件。

您也可以看看与Dependency Walker出口...

+0

感谢您的回复:它说我的函数名是“?myFunction @@ YAPAUHWND __ @@ PAU1 @ HPADPAPAU_stack_t @@ PAUextra_parameters @@@ Z”是否正确?没有使用DLL之前的工作 – 2012-07-11 06:24:23

+0

不,它只需要显示函数名称... – Anders 2012-07-11 06:31:37

+0

外部“C”的工作。谢谢你总是非常有帮助:D – 2012-07-11 09:14:24

0

如果要加载插件在当前脚本目录,使用这个命令:

!addplugindir "."