关于同一个DLL在VC6中LoadLibrary装载成功,在VC2008/C#中装载失改的问题。 请教一个奇怪的问题: 
有一个第三方的DLL,是用于DivX解码和编码的DLL,现在使用这个DLL的过程中出现了不能装载的问题,具体测试过程和结果如下: 1:用VC6编写如下代码,这段代码在Windows 2000,Windows XP和Windows Vista(包括Home版和终极版)等系统下工作正常: typedef VOID (CALLBACK* DECORE)(unsigned long handle, unsigned long dec_opt,void *param1, void *param2); //在对话框中有一个按钮Button1, 
//其作用是打开一个对话框, 
//选取一个DLL文件(选取上面说的那个DivX解码DLL), 
//调用LoadLibrary装载此DLL, 
//取得其中的decore函数的地址, 
//调用此函数, 
//释放DLL。 
void CTestDlg::OnButton1() 

CFileDialog f(TRUE); if (f.DoModal() != IDOK) 
return; 
SetLastError(0); 
CString s = f.GetPathName(); 
//装载DLL。 
HINSTANCE e = ::LoadLibrary(s); 
if (e == NULL) 

//装载DLL失败。 
int n = ::GetLastError(); 
s.Format(_T("Error on load library! %d") , n); 
AfxMessageBox(s); 
return; 

SetLastError(0); 
//获取函数地址。 
DECORE decore = (DECORE)::GetProcAddress(e , "decore"); 
if (decore == NULL) 

int n = ::GetLastError(); 
s.Format(_T("GetProcAddress! %d") , n); 
AfxMessageBox(s); 
return; 

BYTE * p1 = new BYTE[400]; 
BYTE * p3 = new BYTE[400]; 
BYTE * p4 = new BYTE[400]; 
//调用函数。 
decore((unsigned long)p1, 34343, p3, p4); 
::FreeLibrary(e); 
} 2:同样的代码,放在VS2008中的VC环境下调试,在LoadLibrary时返回为NULL,显示的错误号是998(内存分配访问无效)。 
调试时测试了.Net Framework 2.0、3.0、3.5等三种环境,结果都是一样的。 
此问题仅出现在Windows Vista(含Home版和终极版)环境下,在Windows 2000和Windows XP环境下没有问题。 3:同样的调用过程,使用C#来写,在VS2008环境下调试,结果与使用VC++在VS2008环境下调试结果是一样的。 4:使用VC6对此DLL作一层封装,即给它加一个外壳,以同样的格式导出这个DLL的所有导出函数,测试仍和上面的没有封装的结果是一样的,即该问题不受到封装的影响。 4:改用LoadLibraryEx函数,将最后一个参数设为1,即不初始值DLL,则可以装载成功(函数调用会出现异常),如果该参数为0,仍然装载失败。 经过分析:总结出以下的情况: 1:问题只出现在Vista操作系统; 2:问题只出现在.Net编译和运行环境。 3:问题可能是因为该DLL在.Net环境下没有能够正常初始化造成的。 DLL是没有代码的,有没有可能在调用端修改代码或者配置来解决此问题? 顺便说一下:此代码没有在VC2005中调试。
谢谢。

解决方案 »

  1.   

    忘了说了:DLL的下载链接:http://www.aidvr.com/Uploadfiles/aizb/PlayDll.rar
    问题只在于LoadLibrary,还没有进行任何函数调用的问题。
      

  2.   

    LoadLibraryA可以 不知道为什么 
      

  3.   

    “使用VC6对此DLL作一层封装,即给它加一个外壳”这个方法应该可行吧,只不过不能用loadlibrary了,导个def生成个lib试试
    我曾经碰到过一个dll,在dev下能调用,而VC下不能调用,结果我在dev下又封装了一层DLL就好使了。