Announcement

Collapse
No announcement yet.

DllImport Verständnisfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DllImport Verständnisfrage

    hallo miteinander;

    Ich habe eine c++ Dll die folgendes exportiert:
    Code:
    int DLL_EXPORT makeCall(HANDLE line, char* number,LPHANDLE retCall){
        int ret=lineMakeCall((HLINE)line,(LPHCALL)retCall,number,0,NULL);
        return ret;
    }
    Importiert wird diese über c#:
    Code:
    [DllImport(@"tapiAdapter.dll", EntryPoint = "makeCall", ExactSpelling = false, CharSet = CharSet.Ansi, SetLastError = true)]
            static extern int _makeCall(UInt32 lineHandle, string number,out UInt32 retCall);
            public int makeCall(UInt32 lineHandle, string number,out UInt32 retCall){
            	return _makeCall(lineHandle,number,out retCall);
            }
    Und aufgerufen:
    Code:
    int ret=tapi.makeCall(lineHandle,dn,out tmpCall);
    Thread.Sleep(10);//
    Alles funktioniert soweit prima, wenn ich jedoch das Thread.Sleep(10); weglasse, ist der tmpCall immer 0.

    Ein tapi makeCall ist ja asynchron. Ein LineReply empfange ich auch in meinem c# Monitor-Thread. Zu Testzwecken setzte ich den Monitor auf suspent, bevor das makecall aufgerufen wird. (mit resume danach...) Dies änderte aber nix daran, dass dieser tmpCall 0 ist, wenn kein Thread.Sleep(10); dem DLL-Aufruf folgt. Nebenbei: auch wenn 0 drin stand, wurde ein neuer call erzeugt.

    Nun frage ich mich, warum das wohl so ist. Hat jemand eine Erklärung dafür?

    besten dank. he

  • #2
    Vermutlich gibt es im makeCall einen nebenläufigen Thread der zwingend angelaufen sein muß damit du einen korrekten return von der Funktion bekommst.

    Durch den Sleep wird zwingend ein Kontextwechsel durchgeführt. Heißt auch wenn du 0 an sleep übergibst bekommen die anderen Threads einmal die Chance auch Rechenzeit von der CPU zu bekommen.

    Comment


    • #3
      aus dem c# code habe ich das Thread.Sleep(10); entfernt. Denn es liegt tatsächlich an dem lineMakeCall.

      den c++ code änderte ich wie folgt:
      Code:
      int ret=lineMakeCall((HLINE)line,(LPHCALL)retCall,number,0,NULL);
      Sleep(N);
      printf("makecall: %d\n",*retCall);
      ja und dann habe ich nen bissel getestet:
      N==0 -> *retCall==0
      N==10 -> *retCall!=0

      somit ist klar, dass das lineMakeCall scheinbar in sich async ist und nicht auf die fertigstellung des vermuteten thread wartet.

      Ach ja: hat demzufolge auch nichts mit C# zu tun....

      besten dank. h.e.
      Zuletzt editiert von heiko eulitz; 12.07.2008, 10:21. Reason: rechtschreibfehler und was vergessen....

      Comment

      Working...
      X