Probleme beim Dll erstellen
-
Servus,
wollte aus meinem C-Programm eine DLL machen. Leider ohne Erfolg.
Mein C Code funktioniert einwandfrei:#include <windows.h> #include "NIDAQmx.h" #include <stdio.h> #include <NIDAQmx.h> /********************************************************************************/ /***************** DLL-Handling *************************************************/ /********************************************************************************/ /* The two macros below are used as error return codes */ /* in case the DLL does not load, or is missing one or */ /* more functions, respectively. You must define them */ /* to whatever values are meaningful for your DLL. */ #define kFailedToLoadDLLError -9999 #define kCouldNotFindFunction -9998 static HINSTANCE DLLHandle; /* Declare the variables that hold the addresses of the function */ /* pointers. */ static int32 (__CFUNC *DAQmxCreateTask_Ptr)(const char *taskName, TaskHandle *taskHandle); static int32 (__CFUNC *DAQmxCreateAIVoltageChan_Ptr)(TaskHandle taskHandle, const char *physicalChannel, const char *nameToAssignToChannel, int32 terminalConfig, float64 minVal, float64 maxVal, int32 units, const char *customScaleName); static int32 (__CFUNC *DAQmxCfgSampClkTiming_Ptr)(TaskHandle taskHandle, const char *source, float64 rate, int32 activeEdge, int32 sampleMode, uInt64 sampsPerChan); static int32 (__CFUNC *DAQmxStartTask_Ptr)(TaskHandle taskHandle); static int32 (__CFUNC *DAQmxReadAnalogF64_Ptr)(TaskHandle taskHandle, int32 numSampsPerChan, float64 timeout, bool32 fillMode, float64 *readArray, uInt32 arraySizeInSamps, int32 *sampsPerChanRead, bool32 *reserved); static int32 (__CFUNC *DAQmxGetExtendedErrorInfo_Ptr)(char *errorString, uInt32 bufferSize); static int32 (__CFUNC *DAQmxStopTask_Ptr)(TaskHandle taskHandle); static int32 (__CFUNC *DAQmxClearTask_Ptr)(TaskHandle taskHandle); /* Load the DLL and get the addresses of the functions */ static int LoadDLLIfNeeded(void) { if (DLLHandle) return 0; DLLHandle = LoadLibrary("nicaiu.dll"); if (DLLHandle == NULL) { return kFailedToLoadDLLError; } if (!(DAQmxCreateTask_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxCreateTask"))) goto FunctionNotFoundError; if (!(DAQmxCreateAIVoltageChan_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxCreateAIVoltageChan"))) goto FunctionNotFoundError; if (!(DAQmxCfgSampClkTiming_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxCfgSampClkTiming"))) goto FunctionNotFoundError; if (!(DAQmxStartTask_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxStartTask"))) goto FunctionNotFoundError; if (!(DAQmxReadAnalogF64_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxReadAnalogF64"))) goto FunctionNotFoundError; if (!(DAQmxGetExtendedErrorInfo_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxGetExtendedErrorInfo"))) goto FunctionNotFoundError; if (!(DAQmxStopTask_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxStopTask"))) goto FunctionNotFoundError; if (!(DAQmxClearTask_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxClearTask"))) goto FunctionNotFoundError; return 0; FunctionNotFoundError: FreeLibrary(DLLHandle); DLLHandle = 0; return kCouldNotFindFunction; } /* Glue Code for each of the DLL functions */ int32 __CFUNC DAQmxCreateTask(const char *taskName, TaskHandle *taskHandle) { int dllLoadError; if ((dllLoadError = LoadDLLIfNeeded())) return dllLoadError; return (*DAQmxCreateTask_Ptr)(taskName, taskHandle); } int32 __CFUNC DAQmxCreateAIVoltageChan(TaskHandle taskHandle, const char *physicalChannel, const char *nameToAssignToChannel, int32 terminalConfig, float64 minVal, float64 maxVal, int32 units, const char *customScaleName) { int dllLoadError; if ((dllLoadError = LoadDLLIfNeeded())) return dllLoadError; return (*DAQmxCreateAIVoltageChan_Ptr)(taskHandle, physicalChannel, nameToAssignToChannel, terminalConfig, minVal, maxVal, units, customScaleName); } int32 __CFUNC DAQmxCfgSampClkTiming(TaskHandle taskHandle, const char *source, float64 rate, int32 activeEdge, int32 sampleMode, uInt64 sampsPerChan) { int dllLoadError; if ((dllLoadError = LoadDLLIfNeeded())) return dllLoadError; return (*DAQmxCfgSampClkTiming_Ptr)(taskHandle, source, rate, activeEdge, sampleMode, sampsPerChan); } int32 __CFUNC DAQmxStartTask(TaskHandle taskHandle) { int dllLoadError; if ((dllLoadError = LoadDLLIfNeeded())) return dllLoadError; return (*DAQmxStartTask_Ptr)(taskHandle); } int32 __CFUNC DAQmxReadAnalogF64(TaskHandle taskHandle, int32 numSampsPerChan, float64 timeout, bool32 fillMode, float64 *readArray, uInt32 arraySizeInSamps, int32 *sampsPerChanRead, bool32 *reserved) { int dllLoadError; if ((dllLoadError = LoadDLLIfNeeded())) return dllLoadError; return (*DAQmxReadAnalogF64_Ptr)(taskHandle, numSampsPerChan, timeout, fillMode, readArray, arraySizeInSamps, sampsPerChanRead, reserved); } int32 __CFUNC DAQmxGetExtendedErrorInfo(char *errorString, uInt32 bufferSize) { int dllLoadError; if ((dllLoadError = LoadDLLIfNeeded())) return dllLoadError; return (*DAQmxGetExtendedErrorInfo_Ptr)(errorString, bufferSize); } int32 __CFUNC DAQmxStopTask(TaskHandle taskHandle) { int dllLoadError; if ((dllLoadError = LoadDLLIfNeeded())) return dllLoadError; return (*DAQmxStopTask_Ptr)(taskHandle); } int32 __CFUNC DAQmxClearTask(TaskHandle taskHandle) { int dllLoadError; if ((dllLoadError = LoadDLLIfNeeded())) return dllLoadError; return (*DAQmxClearTask_Ptr)(taskHandle); } /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /******************** USB 6009 **************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else int main(void) { int32 error=0; TaskHandle taskHandle=0; int32 read; float64 data[1000]; char errBuff[2048]={'\0'}; /*********************************************/ // DAQmx Configure Code /*********************************************/ DAQmxErrChk (DAQmxCreateTask("",&taskHandle)); DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL)); DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000)); /*********************************************/ // DAQmx Start Code /*********************************************/ DAQmxErrChk (DAQmxStartTask(taskHandle)); /*********************************************/ // DAQmx Read Code /*********************************************/ DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,data,1000,&read,NULL)); printf("Acquired %f points\n",data[0]); Error: if( DAQmxFailed(error) ) DAQmxGetExtendedErrorInfo(errBuff,2048); if( taskHandle!=0 ) { /*********************************************/ // DAQmx Stop Code /*********************************************/ DAQmxStopTask(taskHandle); DAQmxClearTask(taskHandle); } if( DAQmxFailed(error) ) printf("DAQmx Error: %s\n",errBuff); printf("End of program, press Enter key to quit\n"); getchar(); return 0; }
Ich wollte also die dll erstellen bis die Fehlermeldung kam:
error C2440: '=' : 'void *' kann nicht in 'long (__stdcall *)(const char *,unsigned long )' konvertiert werden
Konvertierung von 'void' in Zeiger auf nicht-'void' erfordert eine explizite TypumwandlungDie Fehlermeldung hängt mit den if's (8mal) von folgendem ab. (Funktion ist oben auch enthalten wurde zur Übersichtlichkeit noch einmal hier aufgeführt):
/* Load the DLL and get the addresses of the functions */ static int LoadDLLIfNeeded(void) { if (DLLHandle) return 0; DLLHandle = LoadLibrary("nicaiu.dll"); if (DLLHandle == NULL) { return kFailedToLoadDLLError; } if (!(DAQmxCreateTask_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxCreateTask"))) goto FunctionNotFoundError; if (!(DAQmxCreateAIVoltageChan_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxCreateAIVoltageChan"))) goto FunctionNotFoundError; if (!(DAQmxCfgSampClkTiming_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxCfgSampClkTiming"))) goto FunctionNotFoundError; if (!(DAQmxStartTask_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxStartTask"))) goto FunctionNotFoundError; if (!(DAQmxReadAnalogF64_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxReadAnalogF64"))) goto FunctionNotFoundError; if (!(DAQmxGetExtendedErrorInfo_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxGetExtendedErrorInfo"))) goto FunctionNotFoundError; if (!(DAQmxStopTask_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxStopTask"))) goto FunctionNotFoundError; if (!(DAQmxClearTask_Ptr = (void*) GetProcAddress(DLLHandle, "DAQmxClearTask"))) goto FunctionNotFoundError; return 0; FunctionNotFoundError: FreeLibrary(DLLHandle); DLLHandle = 0; return kCouldNotFindFunction; }
Da ich die Fehlermeldung nicht verwerten kann, benötige ich unbedingt eure Hilfe. Danke im Voraus für jede Antwort, Ihr helft mir echt damit weiter.
Gruss,
Toni
-
als was kompilierst du (c++ sicherlich, sonst gaebs die fehlermeldung nicht) und mit welchem compiler?
-
Ich verwende Microsoft Visual C++ 6.0 für die Erstellung meiner Dll.
Hängt die Fehlermeldung etwa damit zusammen, dass ich aus meinem C-Programm die DLL mit MSVC++ 6.0 erstelle? Wenn ja, was muss ich tun damit es funktioniert?Gruss,
Toni
-
frag da besser mal im WINAPI oder MFC/VC forum nach
dort sind die fragenfür DLL zugehörig, da werden sie denk ich besser beantworte
als bei ANSI CMfg Shade37337
-
Wie schon gesagt, du versuchst als C++ zu kompilieren. Das einfachste ist die Datei Endung von .cpp einfach in .c zu ändern.
-
Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Compiler-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
War leider im verdienten Urlaub.
Danke für die Antworten!
Hat geklappt, danke WebNubbi.
Einfach von cpp in c umbenennen und es geht, klasse!Gruss,
Toni
-
T83 schrieb:
Einfach von cpp in c umbenennen und es geht, klasse!
Naja... wenn Du C++ behalten willst, musst Du einfach nur passend casten...