acmDriverEnum problem

I'm trying to link msacm32.dll to my Delphi program.
Everything goes well until I try to call acmDriverEnum -
I receive different Error messages, sometimes Windows symply
hungs and so on. I think the problem is how to correctly
declare the Callback function and pass it's address to
acmDriverEnum. If somebody has a piece of working Delphi
code which calls acmDriverEnum - would you like to send it
Thank you. Alex.
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

As you haven't posted the failing source, it's kind of hard to tell what the problem is.

But, a common mistake is to forget the stdcall directive. Almost all callback functions should be declared using this.


procedure ThisIsACallback(AParam, AnotherParam : DWORD); stdcall;

If this isn't the problem, leave me a comment along with some source code, and I'll have a look at it.


MadorskyAuthor Commented:
  acmGetVersion: function : DWORD;
  acmDriverEnum: function(fnCallback: Pointer; dwInstance,                           fdwEnum: DWORD) : DWORD ;

function RealCallback
              hadid: DWORD;
              dwInstance, fdwSupport: DWORD
         ):Boolean; stdcall;
{I've tried also cdecl, pascal and so on - without success}
     Result := True;

procedure TForm1.Button1Click(Sender: TObject);
var lhDll, sfHandle: DWORD;

     lhDll := LoadLibrary ('msacm32.dll');
     if lhDll < 32 then
          MessageDlg('No DLL', mtError, [mbOk], 0);

     @acmGetVersion := GetProcAddress(lhDll, 'acmGetVersion');
     if @acmGetVersion = nil then
          MessageDlg('No acmGetVersion', mtError, [mbOk], 0);

     @acmDriverEnum := GetProcAddress(lhDll, 'acmDriverEnum');
     if @acmDriverEnum = nil then
          MessageDlg('No acmDriverEnum', mtError, [mbOk], 0);

     Label1.Caption := IntToHex(acmGetVersion, 8);
{The result is $04000000 - looks good}

     acmDriverEnum(@RealCallBack, 0, 0);
{Here it hungs}
{I've also tried to create the procedural type and variable of
that type, and pass that var to acmDriverEnum by reference -
result is the same.}

  acmGetVersion: function : DWORD;
  acmDriverEnum: function(fnCallback: Pointer; dwInstance, fdwEnum: DWORD) : DWORD ;

Here's the error.

Append a stdcall to these lines.

  acmGetVersion: function : DWORD; stdcall;
  acmDriverEnum: function(fnCallback: Pointer; dwInstance, fdwEnum: DWORD) : DWORD ; stdcall;

acmGetVersion works regardless of calling convention, because it doesn't take any parameters, and return value is passed back the same way in all calling conventions. acmDriverEnum expects parameters to be passed using "stdcall", while your declaration passes parameters using the default "register"




Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.