请教一个奇怪的问题:
有一个第三方的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是没有代码的,有没有可能解决此问题?