hedi
یک شنبه 28 آبان 1391, 04:33 صبح
با سلام به دوستان گرامی و اساتید محترم
من تاپيک های سایت را که جهت شماره گیره با KDTELE مطرح شده بودند را بررسی کردم و به نتيجه واحدی جهت اجرای کارم نرسیدم . مسئله من این است که من می خواهم شماره ای را از طریق دلفی شماره گیری نمايم بدون آن که کاربر آن را ببیند حال چون سیستم کامپیوتری مورد استفاده لپ تاپ می باشد عملا استفاده از یک مودم PCI سلب شده و به این سبب از مودم USB هایی که به لپ تاپ می زنند و در بازار رايج است استفاده کردم اما به هيچ عنوان نتونستم خط را فعال کنم چه برسه به شماره گیری حال از دوستان تقاضا دارم اگر اطلاعاتی راجع به حل این موضوع با این کامپوننت یا راه حل دیگه ای که بتوان با آن شماره گیری کرد ولی USER شماره را نبیند ،دارید اینجا مطرح بفرماييد خیلی نیاز دارم حتی اگر ایراد از مودم هم هست مودم سازگار با لپ تاپ جهت کارکرد با این کامپوننت را معرفی نماييد در کل ممنونم
Felony
یک شنبه 28 آبان 1391, 06:11 صبح
تو مثال های خودش قسمتی جهت گرفتن لیست امکانات مودم وجود داره ، میتونی بررسی کنی ببینی مودمت از کدوم یک از اونها پشتیبانی میکنه .
Mask
یک شنبه 28 آبان 1391, 10:37 صبح
مودم usb رو پشتیبانی نمیکنه.
Felony
یک شنبه 28 آبان 1391, 10:39 صبح
چرا ، من قبلا با مودم لپ تاپ باهاش شماره گیری رو پیاده کردم ولی از Caller ID پشتیبانی نمیکرد .
Mask
یک شنبه 28 آبان 1391, 12:34 عصر
من منظورم مودم اکسترنال usb بودا:لبخندساده:
Felony
یک شنبه 28 آبان 1391, 12:37 عصر
آره ، منم نظورم همون External ها که برای لپ تاپ میفروشن بود ...
hedi
یک شنبه 28 آبان 1391, 18:55 عصر
نظر به لطف دوستان گرامی در پاسخ به سوال بنده حالا این مودم های External که برای Lap top هست الان تو بازار است ؟! من که فقط از این Dell ها دیدم اگر سراغ دارید به من اطلاع بدهید البته من خودم از طريق پورت اقدام کردم و بدون کامپوننت با VB.NET 2010 کار کردم ولی ترجيح میدم با KDTEL و دلفی کار کنم چون کنترل روی خط هم بیشتر است ممنون از راهنمایی هاتون
dark-man
دوشنبه 29 آبان 1391, 22:36 عصر
در حالت عادی ، ویندوز برای هر یک از پورت های usb یک شناسه خاص مشخص می کنه ، مثلا" com 3 ، شما باید این شناسه رو از طریق property مربوط به مودم در device manager پیدا کنی و بعد براساس اون ، مودم رو فعال کنی یا به قول دوستمون اطلاعات مودم رو به دست بیاری .
BORHAN TEC
دوشنبه 29 آبان 1391, 23:00 عصر
در device manager پیدا کنی و بعد براساس اون 
نیازی هم نیست که به صورت دستی از توی Device Manager پیدا کنه. قبلاً توی یکی از برنامه هام یه تابع آماده برای اینکار نوشته بودم که به صورت اتوماتیک پورت مربوطه رو پیدا می کرد. البته برای یک دستگاه دیگه بود ولی میتونه این مشکل رو هم حل کنه. الان باید دنبالش بگردم چون دقیقاً نمیدونم کجاست. انشاالله تا فردا یا نهایتاً تا پس فردا صبح توی همین تاپیک قرارش می دم. جناب hedi اگر یادم رفت لطفاً یک PM بدین و یادآوری کنید.
BORHAN TEC
سه شنبه 07 آذر 1391, 18:47 عصر
سلام
به کلی یادم رفت که به این تاپیک جواب بدم.شرمنده... :خجالت:
روش کار:
طبق گفته dark-man باید پورت مربوطه رو از Device Manager بدست آورد و از آن استفاده کرد. در این پست من راه حل کلی برای بدست آوردن پورت مربوطه را قرار می دهم. :چشمک:
ابتدا این دو تابع رو تعریف کنید:
function SetupEnumAvailableComPorts: TStringList;
var
  RequiredSize: Cardinal;
  GUIDSize: DWORD;
  Guid: TGUID;
  DevInfoHandle: HDEVINFO;
  DeviceInfoData: TSPDevInfoData;
  MemberIndex: Cardinal;
  PropertyRegDataType: DWORD;
  RegProperty: Cardinal;
  RegTyp: Cardinal;
  Key: Hkey;
  Info: TRegKeyInfo;
  S1, S2: string;
  hc: THandle;
begin
  Result := Nil;
  // If we cannot access the setupapi.dll then we return a nil pointer.
  if not LoadsetupAPI then
    Exit;
  try
    // get 'Ports' class guid from name
    GUIDSize := 1; // missing from original code - need to tell function that the Guid structure contains a single GUID
    if SetupDiClassGuidsFromName('Ports', @Guid, GUIDSize, RequiredSize) then
      begin
        // get object handle of 'Ports' class to interate all devices
        DevInfoHandle := SetupDiGetClassDevs(@Guid, Nil, 0, DIGCF_PRESENT);
        if Cardinal(DevInfoHandle) <> Invalid_Handle_Value then
          begin
            try
              MemberIndex := 0;
              Result := TStringList.Create;
              // iterate device list
              repeat
                FillChar(DeviceInfoData, SizeOf(DeviceInfoData), 0);
                DeviceInfoData.cbSize := SizeOf(DeviceInfoData);
                // get device info that corresponds to the next memberindex
                if Not SetupDiEnumDeviceInfo(DevInfoHandle, MemberIndex,
                  DeviceInfoData) then
                  Break;
                // query friendly device name LIKE 'BlueTooth Communication Port (COM8)' etc
                RegProperty := SPDRP_FriendlyName;
                { SPDRP_Driver, SPDRP_SERVICE, SPDRP_ENUMERATOR_NAME,SPDRP_PHYSICAL_DEVICE_OBJECT _NAME,SPDRP_FRIENDLYNAME, }
                SetupDiGetDeviceRegistryProperty(DevInfoHandle, DeviceInfoData,
                  RegProperty, PropertyRegDataType, NIL, 0, RequiredSize);
                SetLength(S1, RequiredSize);
                if SetupDiGetDeviceRegistryProperty(DevInfoHandle,
                  DeviceInfoData, RegProperty, PropertyRegDataType, @S1[1],
                  RequiredSize, RequiredSize) then
                  begin
                    Key := SetupDiOpenDevRegKey(DevInfoHandle, DeviceInfoData,
                      DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
                    if Key <> Invalid_Handle_Value then
                      begin
                        FillChar(Info, SizeOf(Info), 0);
                        // query the real port name from the registry value 'PortName'
                        if RegQueryInfoKey(Key, nil, nil, nil,
                          @Info.NumSubKeys, @Info.MaxSubKeyLen, nil,
                          @Info.NumValues, @Info.MaxValueLen,
                          @Info.MaxDataLen, nil, @Info.FileTime)
                          = ERROR_SUCCESS then
                          begin
                            RequiredSize := Info.MaxValueLen + 1;
                            SetLength(S2, RequiredSize);
                            if RegQueryValueEx(Key, 'PortName', Nil, @RegTyp,
                              @S2[1], @RequiredSize) = ERROR_SUCCESS then
                              begin
                                If (Pos('COM', S2) <> 0) then
                                  begin
                                    // Test if the device can be used
                                    hc := CreateFile(pchar('\\.\' + S2 + #0),
                                      GENERIC_READ or GENERIC_WRITE, 0, nil,
                                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
                                    if hc <> Invalid_Handle_Value then
                                      begin
                                        Result.Add
                                        (Strpas(pchar(S2)) + ': = ' + Strpas
                                        (pchar(S1)));
                                        CloseHandle(hc);
                                      end;
                                  end;
                              end;
                          end;
                        RegCloseKey(Key);
                      end;
                  end;
                Inc(MemberIndex);
              until False;
              // If we did not found any free com. port we return a NIL pointer.
              if Result.Count = 0 then
                begin
                  Result.Free;
                  Result := NIL;
                end
                finally
                  SetupDiDestroyDeviceInfoList(DevInfoHandle);
                end;
            end;
          end;
        finally
          UnloadSetupApi;
        end;
      end;
function FindPort(aDeviceName: string): string;
var
  index: Integer;
  tmp: string;
  ComPortStringList: TStringList; 
begin
  Result := '';
  ComPortStringList := SetupEnumAvailableComPorts;
  if (ComPortStringList <> nil) and (ComPortStringList.Count > 0) then
    for Index := 0 to ComPortStringList.Count - 1 do
      begin
        if Pos(LowerCase(aDeviceName), LowerCase(ComPortStringList[index])) <> 0 then
          begin
            tmp := ComPortStringList[index];
            Result := Trim(Copy(tmp, 1, Pred(Pos(':', tmp))));
          end;
      end;
end;
حالا فرض کنید که دستگاه ما در Device Manager شاخه ای را با نام CBM-34 (یا هر نام دیگری) می سازد. در این حال برای پیدا کردن پورت این دستگاه (مثلاً Com26 و یا هر چیز دیگری) می توانیم از کد زیر استفاده کنیم:
ShowMessage(FindPort('CBM-34'));
موفق و سربلند باشید...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.