2012-02-16 80 views
1

我打电话给一个dll显式地,并且一切工作正常......问题是当我从加载de dll函数返回一个值(释放它)程序停止它看起来像)......似乎什么不要让程序进入...加载dll与C++显式加载

我的代码:

xfsManager::StartUp(...) 
{ 
    WORD result=0; 

    HINSTANCE hGetProcIDDLL = LoadLibrary("c:\\emvlib\\I_krnfct.dll"); 
    FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hGetProcIDDLL),EMV_KERNEL_INITIALIZATION); 

    typedef DWORD (__stdcall * pICFUNC)(LPSTR); 

    pICFUNC dllFunction; 

    dllFunction = pICFUNC(lpfnGetProcessID); 

    DWORD sTmpRc = 0; 
    sTmpRc = dllFunction("something"); 
    if(sTmpRc != EMV_OK) 
    { 
     //NOT OK 
    } 
    else 
    { 
     //OK 
    } 
    FreeLibrary(hGetProcIDDLL); 

    return XFS_OK; // EXITING 
    /*-----------------------------*/ 
} 

非常感谢你的帮助。

Cristovao桑托斯

+2

你试过调试过吗? – LihO 2012-02-16 18:07:54

+5

您确定签名DWORD(__stdcall * pICFUNC)(LPSTR)正确匹配DLL函数的签名和调用约定吗? – 2012-02-16 18:13:26

+0

我没有解释最好的方法。问题不在于调用dll和它返回的值(因为如果我发送一个错误的值作为参数,该函数将返回dll错误),但是当进程退出函数StartUp(在该示例中)...调用此函数后不立即写入日志,但StartUp函数中的所有日志都被写入...而我不明白为什么! PS:签名是好的... – user1214476 2012-02-17 10:50:18

回答

0

您可能需要使用您的呼叫宽字符给LoadLibrary:

HINSTANCE hGetProcIDDLL = LoadLibrary(L"c:\\emvlib\\I_krnfct.dll"); /* notice the L */ 
+0

我没有解释最好的方法。问题不在于调用dll和它返回的值(因为如果我发送一个错误的值作为参数,该函数将返回dll错误),但是当进程退出函数StartUp(在该示例中)...调用此函数后不立即写入日志,但StartUp函数中的所有日志都被写入...而我不明白为什么! – user1214476 2012-02-17 10:23:31

+0

ok,所以有一个日志文件写入到DLL函数内部似乎不起作用,但是日志文件写入来自调用函数做功。它是否正确? – macduff 2012-02-17 14:22:14

+0

No ...在日志文件中,我有StartUp函数的日志,但是当它返回一个值(返回XFS_OK;)之后,日志文件中再没有东西出现了......所以,我认为调用函数DLL(启动在这种情况下)仍在运行或正在做...我不知道为什么... – user1214476 2012-02-17 14:30:06

1

你是不是检查从LoadLibrary()GetProcAddress()返回值 - 在这些工作?

也许你有错误的DLL名称/路径或导出的函数名称。请记住,stdcall函数通常有一个与参数列表大小相对应的“@nn”后缀。但事实并非如此。

+0

我没有解释最好的方法。问题不在于调用dll和它返回的值(因为如果我发送一个错误的值作为参数,该函数将返回dll错误),但是当进程退出函数StartUp(在该示例中)...调用此函数后不立即写入日志,但StartUp函数中的所有日志都被写入...而我不明白为什么! – user1214476 2012-02-17 10:23:20