情况如下:
我在一个DLL里写了个SETHOOK函数, 函数里面调用了CreatdProcess函数.然后调用这个DLL时,出错.
DLL里的函数如下:
void SetHook()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags |= STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWMAXIMIZED;
ZeroMemory( &pi, sizeof( pi ) );


if( !CreateProcess( NULL, // No module name (use command line). 
"c://windows/notepad.exe", // Command line. 
NULL,             // Process handle not inheritable. 
NULL,             // Thread handle not inheritable. 
FALSE,            // Set handle inheritance to FALSE. 
0,                // No creation flags. 
NULL,             // Use parent's environment block. 
NULL,             // Use parent's starting directory. 
&si,              // Pointer to STARTUPINFO structure.
&pi )             // Pointer to PROCESS_INFORMATION structure.
        ) 
{
AfxMessageBox( "CreateProcess failed." );
}


::SetWindowsHookEx(WH_KEYBOARD,&nuoya1keyboardproc,::GetModuleHandle("123.dll"),pi.dwThreadId);
}
在MFC中调用如下:void CTest123Dlg::OnBNTRunFile() 
{
SetHook();
}
test123Dlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __cdecl SetHook(void)" (__imp_?SetHook@@YAXXZ)
请教各位,如何解决这问题,诚心感谢

解决方案 »

  1.   


    #define MYLIBAPI extern "C" __declspec(dllexport);
    MYLIBAPI void WINAPI TestCallBack(PFCALLBACK Func) ;
      

  2.   

    C++ 里边的dll函数名事实上是有一个规则的,你编译的东东里边事实上函数名字并不跟你写的一样,会像?SetHook@@YAXXZ这样,前边一个问好,后边加上一些东西,方便编译器编译吧,二楼正解,加上用C的方式编译表记extern "C",其实跟你把文件名从**.cpp改为**.c是一样的结果的,楼主可以试试看