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 Typumwandlung

    Die 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 C

    Mfg 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...


Anmelden zum Antworten