Hi Kevin,
In the code below ( my DLL to module definition file converter ) , replacing the original line :
FPRINT hFile, CHR$(34) , (char *)(*AddrOfNames+(LPBYTE)hMod) , CHR$(34)
with this one :
FPRINT hFile, CHR$(34) , KAST(char *,*AddrOfNames+KAST(LPBYTE,hMod)) , CHR$(34)
outputs the translation :
fprintf(hFile,"%s% d%s\n",chr(34),(int)KAST(char*,*AddrOfNames+KAST(LPBYTE,hMod)),chr(34));
Here in the line (int)KAST(char*, .... the extra cast (int) should not appear.
$FILETEST OFF
MACRO KAST(to_type, old_obj) = ((to_type)(old_obj))
DIM hMod AS HMODULE
DIM pNThdr AS PIMAGE_NT_HEADERS
DIM pDesc AS PIMAGE_EXPORT_DIRECTORY
DIM NumbOfNames AS DWORD
DIM i AS DWORD
DIM AddrOfNames AS DWORD PTR
DIM cmd$, ext$, deffile$
IF ARGC = 1 THEN
PRINT "Usage : DllToDef.exe DllFile.dll"
END
END IF
cmd$ = COMMAND$(1)
hMod = LOADLIBRARY(cmd$)
IF hMod =0 THEN
PRINT "Error : " & cmd$ & " could not be loaded."
END
END IF
ext$ = BCXSPLITPATH$(cmd$, FEXT)
pNThdr = KAST(PIMAGE_NT_HEADERS, (KAST(LPBYTE, hMod) + KAST(PIMAGE_DOS_HEADER, hMod)->e_lfanew))
pDesc = KAST(PIMAGE_EXPORT_DIRECTORY, (KAST(LPBYTE, hMod) + pNThdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress))
NumbOfNames = pDesc -> NumberOfNames;
IF NumbOfNames = 0 THEN
PRINT cmd$ & " does not export any function(s)."
FreeLibrary(hMod)
END
END IF
deffile$ = BCXSPLITPATH$(cmd$, FNAME)+".def"
OPEN deffile$ FOR OUTPUT AS hFile
IF hFile==0 THEN
PRINT "Cannot create the .def file."
FreeLibrary(hMod)
END
ENDIF
FPRINT hFile, "LIBRARY ", BCXSPLITPATH$(cmd$, FNAME)
FPRINT hFile, "EXPORTS"
AddrOfNames = KAST(DWORD *, (KAST(LPBYTE, hMod) + (size_t)pDesc -> AddressOfNames))
NumbOfNames = NumbOfNames-1
FOR i = 0 TO NumbOfNames
FPRINT hFile, CHR$(34) , (char *)(*AddrOfNames+(LPBYTE)hMod) , CHR$(34)
AddrOfNames = AddrOfNames+1
NEXT i
CLOSE hFile
PRINT cmd$ & " exports" & NumbOfNames+1 & " functions."
FreeLibrary(hMod)