我用ATL COM APPWizard创建了一个dll,并且在其中使用Simple Object生成一个接口.这个接口就有只有一个简单的方法Show。然后我把这个dll拷贝到另一个新工程目录下,接着我在这个新工程中,使用了如下语句
CoInitialize(NULL);
HMODULE hModule;
hModule = LoadLibrary("NewAtlTest.dll");
typedef HRESULT (*pFunc)();
pFunc fun;
fun = (pFunc)GetProcAddress(hModule,"Show");//问题是出在这里,在这里发现fun的地址是空的
fun();//调用函数
CoUninitialize();
看了以前相关的贴子,还是不明白,希望高人指点!!

解决方案 »

  1.   

    如果lpLibFileName参数的库不带路径,那么系统将从以下目录中搜寻该库:
    1.应用程序装载的目录;
    2.当前目录;
    3. Windows 95: Windows系统目录(X:\Windows\System);
       Windows NT: 32位Windows系统目录(X:\Windows\System32);
    4. Windows目录;
    5.PATH环境变量中所列的目录。
    “然后我把这个dll拷贝到另一个新工程目录下”这也许就是问题所在。
      

  2.   

    to titi_lima(李马) 
    “然后我把这个dll拷贝到另一个新工程目录下”这不就可以让编译器找到这个dll。
    还有我察看了hModule 的值为0x10000000,我对这个值感到很奇怪!
      

  3.   

    HMODULE hinstLib = ::LoadLibrary("tw_ocr32.dll");
      

  4.   

    HMODULE hinstLib = ::LoadLibrary("tw_ocr32.dll");
    if (hinstLib != NULL) 

    ......
    }
      

  5.   

    to blue_laser(hgq) 
    这个方法我也试过了,没有效果!
      

  6.   

    在创建DLL时的.def文件中,加没加
    Show @1
      

  7.   

    to wangjinwang(王进) 
    我使用的atl app wizard来创建组件的,添加接口方法的时候我也是使用了wizard
    不是手动添加。系统应该会自动的维护.def
    [id(1), helpstring("method Show")] HRESULT Show();
      

  8.   

    COM动态库应该提供的是接口吧,不应该这么用吧
    COM动态库只要注册,然后声明一个COM对象,然后就可以针对COM接口进行操作了
      

  9.   

    我觉得你应该好好把COM客户端的使用方法弄清楚
    这可是学COM的基础
      

  10.   

    to wzhing(吴兵飞) 
    使用cocreateinstance的方法,已经没有什么问题了!
    我不过想看看LoadLibrary的使用
    难道是他不支持ATL 创建的DLL,可能性不大吧!
    等待高手!!
      

  11.   

    你应该使用cocreateinstance的方法,这才是COM的标准调用。
    下面是普通DLL的调用:
    //如何调用DLL文件
    // 1. loadlibrary
    hDll = LoadLibrary("DisplayAppName");// 2. GetProcAddress
    typedef (void)(*LPDisplayAppName)(void)
    LPDisplayAppName DisplayAppName;
    DisplayAppName=(LPDisplayAppName)GetProcAddress(hDll,"DisplayAppName");// 3. call
    DisplayAppName();// 4. freelibrary
    FreeLibrary(hDll);
      

  12.   

    如果是COM调用,则不能执行loadlibrary。 因为创建Com对象时有系统完成该操作。
    系统负责调度Com库