In case you're interested, here is some sample code using the new API that has been working well for me:
Code:
#include <windows.h>
#include <wintrust.h>
#include <imagehlp.h>
#include <string>
#include "avisynth26.h"
BOOL AvisynthExportsAVSLinkage();
const AVS_Linkage *AVS_linkage = 0;
int main(int argc, char* argv[])
{
//Check if avisynth exports "AVS_Linkage" to make sure at least Avisynth 2.6 Alpha 4 is used
if (!AvisynthExportsAVSLinkage())
{
printf("\nAvisynth 2.6 (Alpha 4 and above) is required.\n");
return -1;
}
HINSTANCE hDLL = ::LoadLibrary("avisynth");
if (!hDLL)
{
cs_avserror = "Failed to load avisynth.dll";
return -1;
}
try
{
IScriptEnvironment *(__stdcall *CreateEnvironment)(int) = (IScriptEnvironment *(__stdcall *)(int))::GetProcAddress(hDLL, "CreateScriptEnvironment");
if (!CreateEnvironment)
{
printf("\nFailed to load CreateScriptEnvironment()\n");
::FreeLibrary(hDLL);
return -1;
}
IScriptEnvironment *AVS_env = CreateEnvironment(AVISYNTH_INTERFACE_VERSION);
if (!AVS_env)
{
printf("\nCould not create IScriptenvironment\n");
::FreeLibrary(hDLL);
return -1;
}
AVS_linkage = AVS_env->GetAVSLinkage();
AVSValue AVS_main;
AVS_main = AVS_env->Invoke("Import", argv[1]);
if (!AVS_main.IsClip()) //not a clip
AVS_env->ThrowError("Script did not return a video clip:\n(%s)", argv[1]);
PClip AVS_clip;
PVideoFrame AVS_frame;
VideoInfo AVS_vidinfo;
AVS_clip = AVS_main.AsClip();
AVS_vidinfo = AVS_clip->GetVideoInfo();
unsigned int uiFrames = (unsigned int)AVS_vidinfo.num_frames;
//read frames
for (unsigned int n = 0; n < uiFrames; n++)
{
AVS_frame = AVS_clip->GetFrame(n, AVS_env);
//...
//...
}
AVS_frame = 0;
AVS_clip = 0;
AVS_main = 0;
AVS_env->DeleteScriptEnvironment();
}
catch(AvisynthError err)
{
//...
}
AVS_linkage = 0;
::FreeLibrary(hDLL);
return 0;
}
BOOL AvisynthExportsAVSLinkage()
{
BOOL bRet = FALSE;
LOADED_IMAGE li;
BOOL bLoaded = MapAndLoad("avisynth", NULL, &li, TRUE, TRUE);
if (!bLoaded)
return bRet;
DWORD expVA = li.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
PIMAGE_EXPORT_DIRECTORY pExp = (PIMAGE_EXPORT_DIRECTORY)ImageRvaToVa(li.FileHeader, li.MappedAddress, expVA, NULL);
DWORD rvaNames = pExp->AddressOfNames;
DWORD *prvaNames = (DWORD*)ImageRvaToVa(li.FileHeader, li.MappedAddress, rvaNames, NULL);
string sName = "";
int iPos = 0;
for (DWORD i = 0; i < pExp->NumberOfNames; ++i)
{
DWORD rvaName = prvaNames[i];
sName = (char *)ImageRvaToVa(li.FileHeader, li.MappedAddress, rvaName, NULL);
iPos = (int)sName.find("AVS_Linkage");
if (iPos >= 0)
{
bRet = TRUE;
break;
}
}
UnMapAndLoad(&li);
return bRet;
}