我的dll源代码:
class signatureMethod
{
       signaureMethod() {};
       ~signatureMethod() {};
       virtual void sign()=0;
       virtual void verify()=0;
 }
class RSAMethod  :: public signatureMethod
{
      Rsasign() {};
      ~Rsasign() {};
       virtual void sign() {....省略.};
      virtual void verify() {....省略};
}在dll中.cpp的主要代码:
//声明动态连接库原形
signatureMethod * getsignaturedll();
//动态连接库接口 
BOOL  WINAPI/*or APIENTRY */ DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{    return TRUE;}
RSAMethod RsaMethod;signatureMethod * getsignaturedll()
{
return (signatureMethod*)(&RsaMethod);
}至此,RSAMethodDll.dll编译成功,
应用到exe文件中就有了问题
//提取签名算法的dll,进行验证
HINSTANCE hdll=NULL;
hdll=::LoadLibrary("RSAMethodDll.dll");
SignMethodDll=(getSignMethodDll)::GetProcAddress(hdll,"getsignaturedll");
signatureMethod *RSAsign=SignMethodDll();
bool flag=RSAsign->verify(pubKey,message,signatureValue);
端点跟踪每次都是进入sign()函数。我就试着在dll中去掉sign(),就通过了,
真是奇怪,不知道我那儿弄错了,请各位帮帮我,多谢多谢

解决方案 »

  1.   

    是不是对齐的问题?添加 #pragma pack(4) 试试?#pragma pack(push, 4)
     
    class signatureMethod
    {
           signaureMethod() {};
           ~signatureMethod() {};
           virtual void sign()=0;
           virtual void verify()=0;
     }
    class RSAMethod  :: public signatureMethod
    {
          Rsasign() {};
          ~Rsasign() {};
           virtual void sign() {....省略.};
          virtual void verify() {....省略};
    }#pragma pack(pop)
      

  2.   

    哪儿没有对齐,是在rsasign中添加吗
      

  3.   

    把代码帖详细点!
    怎么
    class RSAMethod  :: public signatureMethod
    {
          Rsasign() {};  //这是怎么回事咯!!!!
          ~Rsasign() {};
           virtual void sign() {....省略.};
          virtual void verify() {....省略};
    }
      

  4.   

    先把 DLL 和 EXE 全部重新编译一遍试试
      

  5.   

    问题是C++的export和c的export表是不一样的。
    你写一个def文件,就应该可以了。
    我怎么试验都得不到你的结果?(我没有抄你的代码)
      

  6.   

    export  导出的序号不一致造成的错误!
      

  7.   

    微软的扩展dll我一直不赞成,使用def export的dll应该不会有问题!
      

  8.   

    使用了DEF文件对C++风格的导出函数好象没用啊!!!!还没解决啊!我又做了一次!!你看看再帮你UP!
    //DLL
    #include <iostream.h>
    #include <windows.h>
    class signatureMethod
    {
    public:
           signaureMethod() {};
           ~signatureMethod() {};
           virtual void sign()=0;
           virtual void verify()=0;
     };
    class RSAMethod  : public signatureMethod
    {
    public:
          RSAMethod() {};
          ~RSAMethod() {};
           virtual void sign() { cout << "sign " << endl;};
          virtual void verify() {cout << "verify " << endl;};
    };//声明动态连接库原形
    //signatureMethod * getsignaturedll();
    //动态连接库接口 
    BOOL  WINAPI/*or APIENTRY */ DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {    return TRUE;}
    RSAMethod RsaMethod;
    //没有extern "C" 的话EXE中GetProcAddress改为相应的
    //?getsignaturedll@@YAPAVsignatureMethod@@XZ
    extern "C" __declspec(dllexport) signatureMethod * getsignaturedll()
    {
    return (signatureMethod*)(&RsaMethod);
    }
    //EXE
    #include <iostream.h>
    #include <stdio.h>
    #include <windows.h>
    class signatureMethod
    {
    public:
           signaureMethod() {};
           ~signatureMethod() {};
           virtual void sign()=0;
           virtual void verify()=0;
     };typedef signatureMethod* (*getsignaturedll)(void);
    //class signatureMethod * getsignaturedll(void);
    int main(int argc, char *argv[])
    {
    //*
    //typedef (signatureMethod *)(*getSignMethodDll)(); getsignaturedll SignMethodDll = NULL;
    HINSTANCE hdll=NULL;
    hdll=::LoadLibrary("signdll.dll");
    cout << "load " << hdll << endl;
    SignMethodDll=(hdll == NULL ? NULL : (getsignaturedll)::GetProcAddress(hdll,
    "getsignaturedll")/* "?getsignaturedll@@YAPAVsignatureMethod@@XZ" */);
    cout << "getprocaddress " <<  SignMethodDll << endl;
    signatureMethod *RSAsign=SignMethodDll == NULL ? NULL : (signatureMethod *)SignMethodDll();
    if (RSAsign != NULL)
    {
    RSAsign->verify();
    }
    FreeLibrary(hdll);
    //*/
    //class signatureMethod * RSASign = getsignaturedll();
    //RSASign->verify();
    return 0;
    }
    //DLL 编译 CL xx.cpp /LD
    //EXE 编译  CL  XX。CPP