Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

acmDriverEnum problem

Posted on 1997-04-07
3
Medium Priority
?
404 Views
Last Modified: 2010-04-03
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
here?
Thank you. Alex.
0
Comment
Question by:Madorsky
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 3

Expert Comment

by:sperling
ID: 1335225
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.


E.g.

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


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


Regards,

Erik.
0
 

Author Comment

by:Madorsky
ID: 1335226
var
  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}
begin
     Result := True;
end;

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

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

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

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

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

     acmDriverEnum(@RealCallBack, 0, 0);
{Here it hungs}
end;
{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.}

0
 
LVL 3

Accepted Solution

by:
sperling earned 100 total points
ID: 1335227
var
  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"


Regards

Erik.

0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
In a question here at Experts Exchange (https://www.experts-exchange.com/questions/29062564/Adobe-acrobat-reader-DC.html), a member asked how to create a signature in Adobe Acrobat Reader DC (the free Reader product, not the paid, full Acrobat produ…
Suggested Courses

609 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question