October 31, 2025, 02:41:09 PM

News:

IWBasic runs in Windows 11!


Linker Error

Started by ckoehn, July 10, 2010, 07:32:38 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

ckoehn

I'm trying to use the TAPI32 functions.  What I have compiles fine, but the linker is giving this error.  I am running Win7 x64 if that makes any difference.

Linking...
Emergence Linker v1.12 Copyright ÂÃ,© 2009 Ionic Wind Software
Unresolved external __imp_lineInitializeExA
Error: Unable to detect format of C:\Program Files (x86)\EBDev\libs\TAPI32.LIB
Error: Unresolved extern __imp_lineInitializeExA
Error: Unresolved extern __imp_lineNegotiateAPIVersion
Error: Unresolved extern __imp_lineGetDevCapsA
Error: Unresolved extern __imp_lineOpenA
Error: Unresolved extern __imp_lineMakeCallA
Error(s) in linking C:\Users\Public\Emergence Basic\projects\MyProjects\TapiTest.exe

Thanks,
Clint

WayneA

Did you create, or otherwise replace the default tapi32.lib that comes with ebasic?

Also, can you please post the code that is causing this error (or some example code that will cause it).
99 little bugs in the code,
99 bugs in the code,
Fix one bug,
Compile again,
104 little bugs in the code...

All code I post is in the public domain.

ckoehn

Thanks for your response Wayne.  Yes, I did create an import library from the TAP32.dll that came with this computer.  This code was written by Tony and I'm trying to turn it into an inc file that I can use in any program.

' Dial.exe
' Written by Tony Moran August 2008
'
' Should be called in the following way:- Dial -txxxxxxxxxxx where xxxxxxxxxx is the phone number to dial

' Include libraries
$INCLUDE "windowssdk.inc"
$USE "TAPI32.LIB"
$INCLUDE "TAPI.INC"
$INCLUDE "winbase.inc"

SUB TapiDial(STRING PhNumber),INT
' Field definitions

Def ErrorCode as Long
Def LineApp as HLineApp
Def ApiVersion as DWord
Def NumDevs as DWord
Def LineInit as LineInitializeExParams
Def LineExtID as LineExtensionID
Def TapiEvent as Handle
Def Count as Dword
Def DevCaps as LineDevCaps
Def LineNo as HLine
Def LineNumber as Handle
Def Zero as DWord
Def PhoneNumber as string
Def Provider as String
Def ProviderPointer as pointer
Def LineName as STRING
Def LinePointer as pointer
Def APILow as Dword
Def APIHi as DWord
Def CLA as String
'Def GetCommand as pointer

' Field initial values

LineApp = 0
ApiVersion = 0x020002
NumDevs = 0
TapiEvent = 0
LineInit.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT
LineInit.dwTotalSize = 1000
Zero = 0
APILow = 0x010004
APIHi = 0x020002

' Get command line input

'GetCommand = GetCommandLineA()
CLA = PhNumber '#<String>GetCommand

' Check -t or -T was in command line. If not display message

If INSTR(CLA,"-t") = 0 AND INSTR(CLA,"-T") = 0 THEN
MessageBox(Null,"No parameters passed","Dial Error",@MB_OK)
RETURN 0
Endif

' Get position of phone number

Pos = Instr(CLA,"-t")
If Pos = 0 THEN
Pos = Instr(CLA,"-T")
Endif

' Extract phone number

PhoneNumber = Mid$(CLA,pos+2)

' If phone number blank then show Message

If PhoneNumber = "" THEN
MessageBox(Null,"No phone number passed","Dial Error",@MB_OK)
RETURN 0
Endif

' Initialise TAPI and get number of devices

ErrorCode = LineInitializeExa(LineApp,NULL,NULL,"Dial",NumDevs,ApiVersion,LineInit)

' Count through devices

For Count = 0 to NumDevs -1

DevCaps.DwTotalSize = 2000

' Check line supports API version 2

LineNegotiateAPIVersion(LineApp,Count,APILow,APIHi,ApiVersion,LineExtId)

' Get line capabilities and information

LineGetDevCaps(LineApp,Count,ApiVersion,Null,DevCaps)

' Extract the provider name

ProviderPointer = Devcaps
ProviderPointer = ProviderPointer + DevCaps.dwProviderInfoOffset
Provider = #<string>ProviderPointer
LinePointer = Devcaps
LinePointer = LinePointer + DevCaps.dwLineNameOffset
LineName = #<string>LinePointer

' If line has interactive voice capability then use to dial number

If Devcaps.dwMediaModes = 4 or DevCaps.dwMediaModes = 20 Then

LineNumber = DevCaps.dwPermanentLineId
LineNo = Count
MakeCall()
RETURN 1
ENDIF

NEXT Count

MessageBox(NULL,"Sorry, no voice lines found","Dial Error",@MB_OK)

RETURN 0
ENDSUB
' Subroutine to dial number

Sub MakeCall()
Def CallParams as LineCallParams
Def LineApp as HLineApp
Def ApiVersion as DWord
Def LineNumber as Handle
Def Count as Dword
Def PhoneNumber as string

' Set up calling parameters

CallParams.dwTotalSize = 1000
CallParams.dwBearerMode = LINEBEARERMODE_VOICE
CallParams.dwMediaMode = LINEMEDIAMODE_DATAMODEM
CallParams.dwCallParamFlags = LINECALLPARAMFLAGS_IDLE
CallParams.dwAddressMode = LINEADDRESSMODE_ADDRESSID
CallParams.dwAddressId = 0
LineNo = 0
Privileges = LINECALLPRIVILEGE_NONE

' Open the line to dial

ErrorCode = LineOpen(LineApp,Count,LineNumber,ApiVersion,Null,NULL,Privileges,NULL,CallParams)

' Dial the number

ErrorCode = LineMakeCall(LineNumber,LineNumber,PhoneNumber,Null,Null)

' If there is an error then display it in a messagebox so we can work out what went wrong

If ErrorCode < 0 THEN
MessageBox(Null,Str$(ErrorCode),"Dial Error",@MB_OK)
Endif
EndSub


Thanks for your help.
Clint

LarryMc

Clint

I get the exact same error.

I already had a link lib and it failed with it.
Then I renamed it and created a new one and it fails with it also.

I'm on a XP SP3 machine.

LarryMc
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library

sapero

If you change file name extension to lower case, it will link:
$USE "TAPI32.lib"

ckoehn

Thanks sapero.  That took care of that.  What other things are case sensitive?  :)

sapero

I don't remember, maybe .o, .obj and .res files linked with $use directive.
But for sure any external, imported and exported symbol is case sensitive for the linker. For example - subroutine name passed to export directive must be identical to the name of subroutine, you can't change MySub to mysub.
Assembler labels defineded by "declare label_name" are case sensitive too.