Hello, hope someone could please help me with this, it has been driving me nuts for a while now. It is probably something simple but I can not find it
I just want to be able to call a compiled C DLL from another C program. I made a special test project/DLL in order to find out what I am doing wrong.
I am using DEVC++ 4.9.9.2
The test program just loads the DLL and starts looping away, calling the same function(that returns a double) in the DLL a number of times but all of a sudden the loop counter memory space is somehow overwritten and the loop is exited.
When I run the app, here is the output
Here is the DLL.hCode:Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. F:\tmp\test>qtag_test Loading DLL...TESTDLL.DLL loaded Mapping functions...Functions mapped Reading values... Loop 1 1.234560e+005 Loop 2 1.234560e+005 Loop 3 1.234560e+005 Loop 4 1.234560e+005 Loop 5 1.234560e+005 Loop 6 1.234560e+005 Loop 7 1.234560e+005 Loop 8 1.234560e+005 Loop 1090397184 1.234560e+005 Values read Unloading DLL...DLL unloaded. Program terminated normally. F:\tmp\test>
and the DLL.CCode:#ifndef _DLL_H_ #define _DLL_H_ #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */ #include "windows.h" #include <string.h> DLLIMPORT double WINAPI ReadRealValue (LPSTR lpzTagName); #endif /* _DLL_H_ */
And finally the test programCode:#include "TESTDLL.h" #include <windows.h> #include <stdio.h> #include <stdlib.h> BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } DLLIMPORT double WINAPI ReadRealValue (LPSTR lpzTagName) { double dValue=0; dValue = 123456;; return dValue; }
What am I doing wrong here?Code:#include <windows.h> #include <stdio.h> typedef double (*MYPROC)(LPSTR); int main(VOID) { HINSTANCE hinstLib; MYPROC ProcAdd=NULL; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; int uDummy; long lngLoop; double dvalue; dvalue=0; // Get a handle to the DLL module. printf("Loading DLL..."); hinstLib = LoadLibrary(TEXT("TESTDLL.dll")); printf("TESTDLL.DLL loaded\n"); // If the handle is valid, try to get the function address. if (hinstLib != NULL) { printf("Mapping functions..."); ProcAdd = (MYPROC) GetProcAddress(hinstLib, "ReadRealValue"); printf("Functions mapped\n"); // If the function address is valid, call the function. if (NULL != ProcAdd) { fRunTimeLinkSuccess = TRUE; printf("Reading values...\n"); // loop and read lngLoop=0; for (lngLoop=1;lngLoop<200;lngLoop++) { dvalue=ProcAdd("APP_REAL_1_B"); printf("Loop %i %e\n",lngLoop,dvalue); sleep(0); } printf("Values read\n"); } // Free the DLL module. printf("Unloading DLL..."); fFreeResult = FreeLibrary(hinstLib); printf("DLL unloaded.\n"); } // If unable to call the DLL function, use an alternative. if (! fRunTimeLinkSuccess) { printf("Failure loading dll.\n"); } printf("Program terminated normally.\n"); return 0; }
Thankful for help,
/R



LinkBack URL
About LinkBacks





