Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

control applications with TV-tuner's remote control


  • Please log in to reply
23 replies to this topic
dm
  • Members
  • 10 posts
  • Last active: May 23 2010 04:14 PM
  • Joined: 04 May 2006
First of all I'd like to thank the authors for the great scripting language. :)
I've written a highly configurable script to control applications with RC of TV-tuner BeholdTV. If you don't happen to have BeholdTV tuner, this script still might be useful as an example of using RC API to control pc.
Here's the script. And here're some explanations.

Added 2008-05-30:
Another two scripts which complement RemoteControl script are now included (RemoteExplorer and PlaylistGenerator).

Chris
  • Administrators
  • 10727 posts
  • Last active:
  • Joined: 02 Mar 2004
I checked out the explanations. Great presentation.

Thanks for posting your work.

MusX
  • Members
  • 1 posts
  • Last active: Mar 08 2007 09:01 AM
  • Joined: 08 Mar 2007
Hi, i have Leadtek Winfast 2000XP/EXPERT (link to product info at leadtek.com)
and the RC looks:
Posted Image
will this be hard (or available) to modify your script for my RC?

dm
  • Members
  • 10 posts
  • Last active: May 23 2010 04:14 PM
  • Joined: 04 May 2006
Leadtek must provide an API to query the state of the RC. If there is such API it won't be hard to make the script work with your RC.

steliyan
  • Members
  • 48 posts
  • Last active: Jan 29 2015 04:14 PM
  • Joined: 20 Apr 2007
I want to port this to use it with averapi.dll, but no success. Here is an example written in delphi, but I can't test it, because I don't have delphi.

Any help will be appreciated.

Edit: I tested this: http://irlink.ru/dow...07,505_Test.rar and my remote is working with it. I'm trying to use the same DLL.

Edit2: This is cpp source of girder plugin:
//AVerTV Studio Girder plugin by Pavel Chromy

//based on plugin written by Michal Milczewski

 

#include <stdio.h>

#include <windows.h>

#include <winuser.h>

#include "girder.h"

#pragma argsused

 

#define AVERDEVICENUM 28

#define INT_POLE 100 //Remote Poling Interval (ms)

 

typedef void __cdecl (CALLBACK *THWInit)(void);

typedef int  __cdecl (CALLBACK *TGetRemoteData)(void);

//typedef void __cdecl (CALLBACK *TSetRemoteData)(int);

//typedef int  __cdecl (CALLBACK *TGetRemoteFlag)(void);

//typedef void __cdecl (CALLBACK *TSetRemoteFlag)(int);

//typedef int  __cdecl (CALLBACK *TIsRemoteDataReady)(void);

 

#pragma data_seg(".SHARDATA")

static HINSTANCE DllH = NULL;

static THWInit HWInit;

static TGetRemoteData GetRemoteData;

//static TSetRemoteData SetRemoteData;

//static TGetRemoteFlag GetRemoteFlag;

//static TSetRemoteFlag SetRemoteFlag;

//static TIsRemoteDataReady IsRemoteDataReady;

#pragma data_seg()

 

int PoleTimer=0;

bool IsDriverOK = false;

 

t_functions gir_sf;

 

VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);

 

/*=========================================================*/

 

bool LoadDll(HINSTANCE &DllH)

{

  CoInitialize(NULL);

 

  DllH=LoadLibrary("averapi.dll"); // try to load "averapi.dll" - win2k/me

 

 

  if (DllH==NULL) {

    MessageBox(GetForegroundWindow(),"The 'averapi.dll' library can't be found.\nYou have to install Medion software first.","Medion Girder plugin error",MB_OK | MB_ICONHAND| MB_SYSTEMMODAL);

    return false;

  }

  HWInit=(THWInit)GetProcAddress(DllH, "AVER_HWInit");

  GetRemoteData=(TGetRemoteData)GetProcAddress(DllH, "AVER_GetRemoteData");

  //SetRemoteData=(TSetRemoteData)GetProcAddress(DllH, "AVER_SetRemoteData");

  //GetRemoteFlag=(TGetRemoteFlag)GetProcAddress(DllH, "AVER_GetRemoteFlag");

  //SetRemoteFlag=(TSetRemoteFlag)GetProcAddress(DllH, "AVER_SetRemoteFlag");

  //IsRemoteDataReady=(TIsRemoteDataReady)GetProcAddress(DllH, "AVER_IsRemoteDataReady");

 

  if (!HWInit || !GetRemoteData) {

    MessageBox(GetForegroundWindow(),"Error during importing functions from Medion library.","Medion Girder plugin error",MB_OK | MB_ICONHAND| MB_SYSTEMMODAL);

    return false;

  }

 

  // hardware init

  HWInit(); //it takes a while with win9x drivers

    return true;

}

 

bool  UnloadDll(HINSTANCE &DllH)

{

  CoUninitialize();

  bool result = FreeLibrary(DllH);

  DllH = NULL;

   return result;

}

                         

   void StartTimer(int msec)

{

     if (PoleTimer) KillTimer(NULL,PoleTimer);

  PoleTimer=SetTimer(NULL,0,msec,(int(__stdcall *)())TimerProc);

  }

 

void StopTimer(void)

{

  if (PoleTimer) {

    KillTimer(NULL,PoleTimer);

    PoleTimer=0;

  }

}

 

void SendKey(int key)

{

    char payload='\0';

    char eventstr[16];

    sprintf(eventstr,"AVER_%02X",key);

    gir_sf.send_event(eventstr,&payload,1,AVERDEVICENUM);

}

 

VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)

{

  static int key;

 

  //AVerTV Studio - the IsRemoteDataReady() function does not behave as expected

  if ((key=GetRemoteData())&2) {

            SendKey(key);

  }

}

 

//grinder callings

/*=========================================================*/

 

extern "C" __declspec(dllexport) void CALLBACK gir_version(char *data, int size)

{

  strncpy(data,"2.0",size);

}

 

 

extern "C" __declspec(dllexport) void CALLBACK gir_name(char *data, int size)

{

  strncpy(data,"Medion remote controler",size);

}

 

 

extern "C" __declspec(dllexport) void CALLBACK gir_description(char *data, int size)

{

  strncpy(data,"Captures IR events from medion md2819",size);

}

 

 

extern "C" __declspec(dllexport) int CALLBACK gir_devicenum()

{

  return AVERDEVICENUM;

}

 

 

extern "C" __declspec(dllexport) int CALLBACK gir_requested_api(int max_api)

{

  return 1;

}

 

 

extern "C" __declspec(dllexport) int CALLBACK gir_open

  (int gir_major_ver, int gir_minor_ver, int gir_micro_ver, p_functions p)

{

  if (p->size!=sizeof(s_functions))

    return GIR_FALSE;

 

  memcpy((void *)(&gir_sf), p, sizeof(s_functions));

 

         if (IsDriverOK=LoadDll(DllH))  return GIR_TRUE;

          return GIR_FALSE;

}

 

 

extern "C" __declspec(dllexport) int CALLBACK gir_close()

{

  UnloadDll(DllH);

  return GIR_TRUE;

}

 

 

extern "C" __declspec(dllexport) int CALLBACK gir_start()

{

  if (!IsDriverOK) return GIR_FALSE;

 

  StartTimer(INT_POLE);

  return GIR_TRUE;

}

 

 

extern "C" __declspec(dllexport) int CALLBACK gir_stop()

{

  if (!IsDriverOK) return GIR_FALSE;

 

  StopTimer();

  return GIR_TRUE;

}

 

/*=========================================================*/


dm
  • Members
  • 10 posts
  • Last active: May 23 2010 04:14 PM
  • Joined: 04 May 2006
Hmm, given the girder source the port should be pretty straightforward. I would modify Core.ahk like this. Note the call to CoInitialize and CoUninitialize. Hope it helps.

P.S. Of course, you'll need to remap RC codes if it works, I haven't touched them.

/* ----------------------------------------------------------------------------
    Initialization, uninitialization, RC timer setup.
*/

; Initialize COM library
DllCall( "ole32\CoInitialize", "Uint", 0 )

; Load averapi.dll
HModule := DllCall( "LoadLibrary", "Str", "averapi.dll", "Cdecl" )
ResDllCall( "averapi.dll", "LoadLibrary" )
if ( HModule = 0 )
{
    MsgBox, 16, , averapi.dll could not be loaded
    ExitApp
}   

; Initialize card
DllCall( "averapi\AVER_HWInit", "Cdecl" )
ResDllCall( "averapi.dll", "AVER_HWInit" )

; Set window title match mode
SetTitleMatchMode, 2

; Form a window group of system windows
GroupAdd, WG_System, Program Manager ahk_class Progman
GroupAdd, WG_System, ahk_class WorkerW
GroupAdd, WG_System, ahk_class Shell_TrayWnd

; Set the subroutine to run on exit 
OnExit, UninitAndExit

; Calculate number of signals to skip to ensure repeat delay/interval
NumSignalsRepeatDelay := Round( RCRepeatDelay/RCInterval ) - 1
NumSignalsRepeatInterval := Round( RCRepeatInterval/RCInterval ) - 1

; Initialize RC mode
RCMode = RCM_Wait
CntSignals = 0

; Initialize confirm mode
ConfirmMode = CM_None

; Set timer to check RC state
SetTimer, TimerRC, %RCInterval%

return

; --- The end of auto-execute section of the script ---

; Uninitialize the card on exit
UninitAndExit:

    ; Uninitialize COM library
    DllCall( "ole32\CoUninitialize" )
    
    ExitApp

/* ----------------------------------------------------------------------------
    Timer to check the state of the RC. RC key repeat delay and interval are
    controlled here.
*/
    
TimerRC:

    Res := DllCall( "averapi\GetRemoteData", "Cdecl Int" )
    ResDllCall( "averapi.dll", "GetRemoteData" )

    ; No button pressed
    if ( !Res&2 )
    {
        RCMode = RCM_Wait
        CntSignals = 0
        return
    }

    if ( ( ( RCMode = "RCM_RepeatDelay" ) && ( CntSignals < NumSignalsRepeatDelay ) )
            || ( ( RCMode = "RCM_RepeatInterval" ) && ( CntSignals < NumSignalsRepeatInterval ) ) )
    {
        CntSignals++
        return
    }

    if      ( Res = 0 )
    {
        RCKey = RCK_0
    }
    else if ( Res = 1 )
    {
        RCKey = RCK_1
    }
    else if ( Res = 2 )
    {
        RCKey = RCK_2
    }
    else if ( Res = 3 )
    {
        RCKey = RCK_3
    }
    else if ( Res = 4 )
    {
        RCKey = RCK_4
    }
    else if ( Res = 5 )
    {
        RCKey = RCK_5
    }
    else if ( Res = 6 )
    {
        RCKey = RCK_6
    }
    else if ( Res = 7 )
    {
        RCKey = RCK_7
    }
    else if ( Res = 8 )
    {
        RCKey = RCK_8
    }
    else if ( Res = 9 )
    {
        RCKey = RCK_9
    }
    else if ( Res = 10 )
    {
        RCKey = RCK_Recall
    }
    else if ( Res = 11 )
    {
        RCKey = RCK_Up
    }
    else if ( Res = 12 )
    {
        RCKey = RCK_Right
    }
    else if ( Res = 13 )
    {
        RCKey = RCK_Mode
    }
    else if ( Res = 14 )
    {
        RCKey = RCK_Sleep
    }
    else if ( Res = 15 )
    {
        RCKey = RCK_Audio
    }
    else if ( Res = 16 )
    {
        RCKey = RCK_Info
    }
    else if ( Res = 17 )
    {
        RCKey = RCK_TvAv
    }
    else if ( Res = 18 )
    {
        RCKey = RCK_Power
    }
    else if ( Res = 19 )
    {
        RCKey = RCK_Mute
    }
    else if ( Res = 20 )
    {
        RCKey = RCK_Menu
    }
    else if ( Res = 21 )
    {
        RCKey = RCK_Down
    }
    else if ( Res = 22 )
    {
        RCKey = RCK_Ok
    }
    else if ( Res = 23 )
    {
        RCKey = RCK_Teletext
    }
    else if ( Res = 24 )
    {
        RCKey = RCK_Left
    }
    else if ( Res = 26 )
    {
        RCKey = RCK_ChanUp
    }
    else if ( Res = 27 )
    {
        RCKey = RCK_VolUp
    }
    else if ( Res = 28 )
    {
        RCKey = RCK_Function
    }
    else if ( Res = 30 )
    {
        RCKey = RCK_ChanDown
    }
    else if ( Res = 31 )
    {
        RCKey = RCK_VolDown
    }
    
    if      RCMode = RCM_Wait
    {
        RCMode = RCM_RepeatDelay
    }
    else if RCMode = RCM_RepeatDelay
    {
        RCMode = RCM_RepeatInterval
    }
    CntSignals = 0
    
    if ( ( RCKey = RCKClose ) && ( RCMode = "RCM_RepeatInterval" ) )
        return
        
    Goto, AppManager
    
/* ----------------------------------------------------------------------------
    Application manager - manages remotely controlled applications.
    Firstly, the special RC keys for closing applications,
    shutdown, etc. are processed. Secondly, the special RC keys each 
    controlling one application are processed. Thirdly, any other RC keys 
    are passed to the handler of the active application.
*/

AppManager:

    ; Find managed application (RCKey = key controlling one of the applications)
    AppManaged := ""
    Loop
    {
        App := App%A_Index%
        if ( App = "" )
        {
            break
        }
        if ( RCKey = RCKApp%A_Index% )
        {
            AppManaged := App
            PathAppManaged := PathApp%A_Index%
            if ( PathAppManaged = "" )
            {
                MsgBox, 16, , Path not specified for %App%
                ExitApp
            }
            WinTitleAppManaged := WinTitleApp%A_Index%
            OwnerAppManaged := OwnerApp%A_Index%
        }
    }

    ; Find active application
    AppActive := ""
    Loop
    {
        App := App%A_Index%
        if ( App = "" )
        {
            break
        }
        if ( WinTitleApp%A_Index% = "" )
        {
            continue
        }
        IfWinActive, % WinTitleApp%A_Index%
        {
            AppActive := App
            HKCloseAppActive := HKCloseApp%A_Index%
            break
        }
    }
    
    ; RC key for closing applications is pressed
    if ( RCKey = RCKClose )
    {
        if ( AppActive != "" )
        {
            if ( HKCloseAppActive != "" )
            {
                Send, %HKCloseAppActive%
            }
            else
            {
                WinClose, A
            }
        }
        else IfWinNotActive, ahk_group WG_System
        {
            WinClose, A
        }
        else
        {
            ; No active windows, confirm that the user wants to shutdown the computer
            ConfirmMode = CM_Shutdown
            OSDText( TextShutdown, TextColorShutdown, FontNameShutdown, FontSizeShutdown, DelayShutdown )
        }
                    
        return
    }
    
    ; If confirmed shutdown the computer
    if ( ( ConfirmMode = "CM_Shutdown" ) && ( RCKey = RCKConfirm ) )
    {
        Shutdown, 8
        return
    }        

    ; RC key to show clock is pressed
    if ( RCKey = RCKClock )
    {
        Gosub, Wake
        TextClock = %A_Hour%:%A_Min%
        OSDText( TextClock, TextColorClock, FontNameClock, FontSizeClock, DelayClock )
        return
    }
    
    ; A special RC key managing one application is pressed, start/activate the 
    ; application
    if ( AppManaged != "" )
    {
        if ( WinTitleAppManaged = "" )
        {
            Run, %PathAppManaged%, , UseErrorLevel
            ResRun( PathAppManaged )
            if ( OwnerAppManaged != "" )
            {
                Index := AppIndexByName( OwnerAppManaged )
                WinWait, % WinTitleApp%Index%
                WinActivate
            }
        }
        else IfWinNotExist, %WinTitleAppManaged%
        {
            Run, %PathAppManaged%, , UseErrorLevel
            ResRun( PathAppManaged )
        }
        else IfWinNotActive
        {
            WinActivate
        }
        return
    }
    
    ; Pass RC key to the handler of the active application
    if ( AppActive != "" )
    {
        LabelApp = %AppActive%
        if ( !IsLabel( LabelApp ) )
        {
            MsgBox, 16, , No handler for %AppActive% application (the handler must be called %LabelApp%)
            ExitApp
        }
        Goto, %LabelApp%
    }

    return

/* ----------------------------------------------------------------------------
    OSD text.
*/

; Show OSD text in the center of the screen
OSDText( Text, TextColor, FontName, FontSize, Delay )
{
    global TxtOSD
    
    Gui, Destroy
    
    Gui, +AlwaysOnTop +LastFound +Owner
    WinColor = White
    Gui, Color, %WinColor%
    WinSet, TransColor, %WinColor%
    Gui, -Caption

    X := 0.05*A_ScreenWidth
    W := 0.90*A_ScreenWidth
    Gui, Font, s%FontSize%, %FontName%
    Gui, Add, Text, x%X% w%W% Center c%TextColor% vTxtOSD, %Text%

    Gui, Show, NoActivate

    SetTimer, RemoveOSD, %Delay%

    return
}

; Remove OSD
RemoveOSD:

    SetTimer, RemoveOSD, Off
    Gui, Destroy

    ; Set confirm mode to none in case OSD was used to confirm something
    ConfirmMode = CM_None
    
    return
        
/* ----------------------------------------------------------------------------
    Auxilary routines.
*/

; Test the result of DllCall
ResDllCall( DllName, FuncName )
{
    if ( ErrorLevel = 0 )
        return
    if ( ErrorLevel = -1 )
    {
        MsgBox, 16, , DLL name or function name specified incorrectly when calling function %FuncName% in DLL %DllName%
        ExitApp
    }
    if ( ErrorLevel = -2 )
    {
        MsgBox, 16, , Return type or argument type specified incorrectly when calling function %FuncName% in DLL %DllName%
        ExitApp
    }
    if ( ErrorLevel = -3 )
    {
        MsgBox, 16, , %DllName% could not be accessed
        ExitApp
    }
    if ( ErrorLevel = -4 )
    {
        MsgBox, 16, , Function %FuncName% not found inside %DllName%
        ExitApp
    }
    StringLeft, c, ErrorLevel, 1
    StringTrimLeft, n, ErrorLevel, 1
    if ( c = "A" )
    {
        MsgBox, 16, , Size of argument list incorrect by %n% bytes (or cdecl required) when calling function %FuncName% in DLL %DllName%
        ExitApp
    }
    if ( ErrorLevel > 0 )
    {
        MsgBox, 16, , Fatal exception %ErrorLevel% when calling function %FuncName% in DLL %DllName%
        ExitApp
    }
    return
}

; Test the result of Run/RunWait
ResRun( Path )
{
    if ErrorLevel = ERROR
    {
        MsgBox, 16, , Failed to launch %Path%
        ExitApp
    }
}

; Get application index by its name
AppIndexByName( App )
{
    Loop
    {
        if ( App%A_Index% = "" )
        {
            break
        }
        if ( App = App%A_Index% )
        {
            return A_Index
        }
    }
    return RES_NotFound
}

; Wake the computer
Wake:
    Send, ^#!{F12}
    return


steliyan
  • Members
  • 48 posts
  • Last active: Jan 29 2015 04:14 PM
  • Joined: 20 Apr 2007
Throws me an exception:
Posted Image

steliyan
  • Members
  • 48 posts
  • Last active: Jan 29 2015 04:14 PM
  • Joined: 20 Apr 2007
This is fully working code in Delphi (tested - thanks to AlexPas):
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  Dialogs, ActiveX, Registry, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Memo1: TMemo;
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    AVerAPI: HInst;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TAVerHWInit = function (Handle: HWND): Byte; cdecl; // AVER_HWInit
  TAVerGetRemoteData = function (var Button: Byte): Integer; cdecl; // AVER_GetRemoteData
  TAVerFree = procedure (Data: Integer); cdecl; // AVER_Free

var
  AVerHWInit: TAVerHWInit;
  AVerGetRemoteData: TAVerGetRemoteData;
  AVerFree: TAVerFree;
  AverAppRun: Bool = False;
  AVerAppFile: String;
  LastButton: Integer = 0;

procedure TForm1.FormCreate(Sender: TObject);
var
  Result: Integer;
  hAVerApp: HWnd;
  Reg: TRegistry;
  FileName: String;
begin
  hAVerApp := FindWindow('AVerRemoteApp', nil);
  if hAVerApp <> 0 then
    begin
      Memo1.Lines.Add('Closing AVer QuickTV application');
      AverAppRun := True;
      PostMessage(hAVerApp, WM_COMMAND, $9C49, 0);
    end
  else
    Memo1.Lines.Add('AVer QuickTV application is not started');

  CoInitialize(nil);
  AVerAPI := 0;
  Reg := TRegistry.Create(KEY_READ);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    try
      Reg.OpenKeyReadOnly('\SOFTWARE\AVerMedia TECHNOLOGIES, Inc.');
      try
        FileName := Reg.ReadString('Application Path');
        if FileName = '' then
          raise Exception.Create('Value "Application Path" not found');
      except
        on E: Exception do
          begin
            Memo1.Lines.Add(Format('Registry reading: Error "%s"', [E.Message]));
            Exit;
          end;
      end
    except
      Memo1.Lines.Add('Registry key "HKEY_LOCAL_MACHINE\SOFTWARE\AVerMedia TECHNOLOGIES, Inc." not found');
    end;
  finally
    FreeAndNil(Reg);
  end;
  Memo1.Lines.Add(Format('Registry reading: OK averapi.dll path is "%s"', [FileName]));
  AVerAppFile := IncludeTrailingPathDelimiter(FileName) + 'QuickTV.exe';
  FileName := IncludeTrailingPathDelimiter(FileName) + 'averapi.dll';
  AVerAPI := LoadLibrary(PChar(FileName));
  if AVerAPI <> 0 then
    begin
      Memo1.Lines.Add('Loading averapi.dll: OK');
      AVerHWInit :=
        TAVerHWInit(GetProcAddress(AVerAPI, 'AVER_HWInit'));
      if @AVerHWInit <> nil then
        Memo1.Lines.Add('Get function AVER_HWInit: OK')
      else
        Memo1.Lines.Add(Format('Get function AVER_HWInit: Error %d', [GetLastError]));
      AVerGetRemoteData :=
        TAVerGetRemoteData(GetProcAddress(AVerAPI, 'AVER_GetRemoteData'));
      if @AVerGetRemoteData <> nil then
        Memo1.Lines.Add('Get function AVER_GetRemoteData: OK')
      else
        Memo1.Lines.Add(Format('Get function AVER_GetRemoteData: Error %d', [GetLastError]));
      AVerFree :=
        TAVerFree(GetProcAddress(AVerAPI, 'AVER_Free'));
      if @AVerFree <> nil then
        Memo1.Lines.Add('Get function AVER_Free: OK')
      else
        Memo1.Lines.Add(Format('Get function AVER_Free: Error %d', [GetLastError]));
      Result := AVerHWInit(0);
      if Result = 0 then
        Memo1.Lines.Add('Call function AVER_HWInit: OK')
      else
        Memo1.Lines.Add(Format('Call function AVER_HWInit: Error %d', [Result]));
    end
  else
    Memo1.Lines.Add(Format('Loading averapi.dll: Error %d', [GetLastError]));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if AVerAPI <> 0 then
    AVerFree(0);
  CoUninitialize;
  if AverAppRun then
    WinExec(PChar(AVerAppFile), 0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Data: Byte;
  Result: Integer;
begin
  Result := -1;
  if AVerAPI <> 0 then
    try
      Data := $FF;
      if AVerGetRemoteData(Data) = 0 then
        begin
          if (Data and 2) <> 0 then
            begin
              //LastButton := Data and $FD;
              Result := Data and $FF;
            end
          else
            Result := LastButton;
        end
    except
    end;
  Label1.Caption := IntToStr(Result);
end;

end.


Here is what I've done (in AHK):
#SingleInstance Force

Gui, Add, Text, x5 y5  vText1, Button:
Gui, Add, Text, x45 y5 vText2, -1
Gui, Add, Edit, x5 y20 w300 h100 vEdit1 ReadOnly
Gui, Show,, AverAPI

DllCall("ole32\CoInitialize", "Uint", 0)

API := DllCall("LoadLibrary", "Str", "averapi.dll", "Cdecl")

If API <> 0
{
	GuiControl,, Edit1, Loading averapi.dll - OK!

	HWInit := DllCall("GetProcAddress", UInt, API, "str", "AVER_HWInit")
	GuiControlGet, Temp,, Edit1
	If Temp <> 0
		GuiControl,, Edit1, %Temp%`nGet function AVER_HWInit - OK!
	Else
		GuiControl,, Edit1, %Temp%`nGet function AVER_HWInit - FAILED!

	GetRemoteData := DllCall("GetProcAddress", UInt, API, "str", "AVER_GetRemoteData")
	GuiControlGet, Temp,, Edit1
	If Temp <> 0
		GuiControl,, Edit1, %Temp%`nGet function AVER_GetRemoteData - OK!
	Else
		GuiControl,, Edit1, %Temp%`nGet function AVER_GetRemoteData - FAILED!

	Free := DllCall("GetProcAddress", UInt, API, "str", "AVER_Free")
	GuiControlGet, Temp,, Edit1
	If Temp <> 0
		GuiControl,, Edit1, %Temp%`nGet function AVER_Free - OK!
	Else
		GuiControl,, Edit1, %Temp%`nGet function AVER_Free - FAILED!
}
Else
	GuiControl,, Edit1, Loading averapi.dll - FAILED!

SetTimer, TimerRC, 250
	
Return

TimerRC:
	Res := DllCall("averapi\AVER_GetRemoteData", UChar, ff, "Cdecl")
	GuiControl,, Text2, %Res%
return

ButtonExit:
	If API <> 0
		DllCall( "averapi\AVER_Free", "Cdecl" )
	DllCall( "ole32\CoUninitialize", "Uint", 0 )
	GuiClose:
ExitApp


dm
  • Members
  • 10 posts
  • Last active: May 23 2010 04:14 PM
  • Joined: 04 May 2006

Throws me an exception:

I guess, this line is wrong then (yeah I have also misspelled the function name):
Res := DllCall( "averapi\GetRemoteData", "Cdecl Int" )
The function must have an argument.

I think the problem in your code is with the same line:
Res := DllCall("averapi\AVER_GetRemoteData", UChar, ff, "Cdecl")
Here the RC code is returned in the function argument. In order for this to work the argument must have UChar* type, not UChar. Try the following instead:
Res := DllCall("averapi\AVER_GetRemoteData", "UChar*", Data, "Cdecl")
Data should contain the code.

steliyan
  • Members
  • 48 posts
  • Last active: Jan 29 2015 04:14 PM
  • Joined: 20 Apr 2007
Blahh, that pointers. Thanks, now it's working like charm.

  • Guests
  • Last active:
  • Joined: --
Hi there, first of all, sorry for my bad English. I'd like to use my AverTV 305 remote through AutoHK, but I'm not a programmer, so I don't know where to start, would You help me, please?
First of all, I using Vista, so I installed new soft, AverTV 6.3 from there: http://irlink.ru/download/Aver203,305,307,505_Test.rar It displayed "AVER_HWInit() failed". Then I changed old averapi.dll to new one from AverTV 6 folder, it sayd that CardID.dll is required, i put CardID.dll from ATV6 folder there too. Now it says "The procedure entry point AVER_Free could not be located in averapi.dll". So, I guess, script in this thread won't work with new Vista driver :( Can this problem be solved? Thanks a lot!

  • Guests
  • Last active:
  • Joined: --
Hi there, first of all, sorry for my bad English. I'd like to use my AverTV 305 remote through AutoHK, but I'm not a programmer, so I don't know where to start, would You help me, please?
First of all, I using Vista, so I installed new soft, AverTV 6.3 from there: http://irlink.ru/download/Aver203,305,307,505_Test.rar It displayed "AVER_HWInit() failed". Then I changed old averapi.dll to new one from AverTV 6 folder, it sayd that CardID.dll is required, i put CardID.dll from ATV6 folder there too. Now it says "The procedure entry point AVER_Free could not be located in averapi.dll". So, I guess, script in this thread won't work with new Vista driver :( Can this problem be solved? Thanks a lot!

dm
  • Members
  • 10 posts
  • Last active: May 23 2010 04:14 PM
  • Joined: 04 May 2006
Well I guess AverTV API has changed in the new version. If you post some description of the new API (C header file, etc) maybe I'll be able to help.

vovanius
  • Members
  • 4 posts
  • Last active: May 01 2010 06:49 PM
  • Joined: 24 Feb 2009
To be honest - I don't know where to start. All I have - those new dll's from AverTV 6.3. I tried to google avermedia API description with no significant success, looks like Aver did not publish this "for all". Can You tell me what exacltly I have to search? Thanks.

dm
  • Members
  • 10 posts
  • Last active: May 23 2010 04:14 PM
  • Joined: 04 May 2006
I extacted the dll from the installer, it is a COM object. Which isn't particularly good since I haven't had much experience with COM, let alone working with it in AHK. Maybe I'll look into this further later, but I can't promise anything. If you find any info on using this dll I guess it can help.