首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

动态调用dll不成功,该怎么处理

2014-01-03 
动态调用dll不成功想学着动态调用dll,写了个简单的例子 ,可是GetProcAddress出错了 具体代码如下,请帮我看

动态调用dll不成功
想学着动态调用dll,写了个简单的例子 ,可是GetProcAddress出错了 具体代码如下,请帮我看看有什么错,
dll中

extern "C" __declspec(dllexport) AnsiString DealPassword(AnsiString mm);
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
AnsiString DealPassword(AnsiString mm) //想试写一个简单字符串加密,还没有测试
{                                      //结果GetProcAddress一直不成功 汗 
  AnsiString new_mm = "";
  //char s = '';
  for(int i = 1; i <= mm.Length() ; i++)
   {
     new_mm += (mm[i] + 9) * 234;
   }
  return new_mm;
}

在主程序中,网上看了妖哥给别人的例子,试了试,LoadLibrary成功了,但GetProcAddress始终是null,
代码没有错,是不是应该设置什么呢?
typedef AnsiString (*DealPassword)(AnsiString mm);
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}

void __fastcall TForm3::rzbtbtn1Click(TObject *Sender)
{
  AnsiString s,r;
  HINSTANCE dd;
  AnsiString aa = Form2->FileLoc + "\\DealUserData.dll" ;
  dd = LoadLibrary("DealUserData.dll");
  if(dd)
   {
 DealPassword deal = (DealPassword)GetProcAddress(dd,"DealPassword");
 if(deal) //这是deal始终是Null
  {
            s = deal(edt2->Text);
    ShowMessage(s);
  }
 else
  {
ShowMessage("GetProcAddress错误");
  }
   }
  else
   {
 ShowMessage("LoadLibrary错误");
   }
}

[解决办法]
AnsiString DealPassword(AnsiString mm);

改成 AnsiString __stdcall DealPassword(AnsiString mm);

[解决办法]
本帖最后由 ccrun 于 2013-11-28 14:09:22 编辑 首先,建议DLL中导出函数的约定为__stdcall,并且按照类C的编译和连接规约来编译和连接。
其次,不建议用AnsiString类型作为导出函数的参数或返回值。
所以,这样改:
DLL中

extern "C" __declspec(dllexport) void __stdcall DealPassword(LPSTR mm);

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------
void __stdcall DealPassword(LPSTR mm)

    size_t uLen = strlen(mm);

    for (size_t i = 0; i < uLen; i++)
    {
        // 算法代码略过
        // ...
    }
}

APP中:

typedef void __stdcall (*DEALPASSWORD)(LPSTR mm);

void __fastcall TForm3::rzbtbtn1Click(TObject *Sender)
{
    AnsiString strDllFile = Form2->FileLoc + "\\DealUserData.dll" ;
    if (!FileExists(strDllFile ))
    {
    ShowMessage("DLL文件没找到,请检查文件路径名!");
    return;
    }
    
    HINSTANCE h = ::LoadLibraryA(strDllFile .c_str());

    if (h)
    {
        DEALPASSWORD DealPassword = (DEALPASSWORD)
            ::GetProcAddress(h, "DealPassword");
            
        if (DealPassword )
        {
            char *lp = new char[edt2->Text.Length() + 1];


            strcpy(lp, edt2->Text.c_str());
            lp[edt2->Text.Length()] = 0x0;
            
            deal(lp);
            ShowMessage(lp);
            
            delete []lp;
            
            ::FreeLibrary(h);
        }
        else
        {
            ShowMessage("GetProcAddress错误");
        }
    }
    else
    {
        ShowMessage("LoadLibrary错误");
    }
}


[解决办法]
动态调用dll不成功,该怎么处理

热点排行