PDA

View Full Version : سوال: کار با KDTELE و مودم USB



hedi
یک شنبه 28 آبان 1391, 03:33 صبح
با سلام به دوستان گرامی و اساتید محترم
من تاپيک های سایت را که جهت شماره گیره با KDTELE مطرح شده بودند را بررسی کردم و به نتيجه واحدی جهت اجرای کارم نرسیدم . مسئله من این است که من می خواهم شماره ای را از طریق دلفی شماره گیری نمايم بدون آن که کاربر آن را ببیند حال چون سیستم کامپیوتری مورد استفاده لپ تاپ می باشد عملا استفاده از یک مودم PCI سلب شده و به این سبب از مودم USB هایی که به لپ تاپ می زنند و در بازار رايج است استفاده کردم اما به هيچ عنوان نتونستم خط را فعال کنم چه برسه به شماره گیری حال از دوستان تقاضا دارم اگر اطلاعاتی راجع به حل این موضوع با این کامپوننت یا راه حل دیگه ای که بتوان با آن شماره گیری کرد ولی USER شماره را نبیند ،دارید اینجا مطرح بفرماييد خیلی نیاز دارم حتی اگر ایراد از مودم هم هست مودم سازگار با لپ تاپ جهت کارکرد با این کامپوننت را معرفی نماييد در کل ممنونم

Felony
یک شنبه 28 آبان 1391, 05:11 صبح
تو مثال های خودش قسمتی جهت گرفتن لیست امکانات مودم وجود داره ، میتونی بررسی کنی ببینی مودمت از کدوم یک از اونها پشتیبانی میکنه .

Mask
یک شنبه 28 آبان 1391, 09:37 صبح
مودم usb رو پشتیبانی نمیکنه.

Felony
یک شنبه 28 آبان 1391, 09:39 صبح
چرا ، من قبلا با مودم لپ تاپ باهاش شماره گیری رو پیاده کردم ولی از Caller ID پشتیبانی نمیکرد .

Mask
یک شنبه 28 آبان 1391, 11:34 صبح
من منظورم مودم اکسترنال usb بودا:لبخندساده:

Felony
یک شنبه 28 آبان 1391, 11:37 صبح
آره ، منم نظورم همون External ها که برای لپ تاپ میفروشن بود ...

hedi
یک شنبه 28 آبان 1391, 17:55 عصر
نظر به لطف دوستان گرامی در پاسخ به سوال بنده حالا این مودم های External که برای Lap top هست الان تو بازار است ؟! من که فقط از این Dell ها دیدم اگر سراغ دارید به من اطلاع بدهید البته من خودم از طريق پورت اقدام کردم و بدون کامپوننت با VB.NET 2010 کار کردم ولی ترجيح میدم با KDTEL و دلفی کار کنم چون کنترل روی خط هم بیشتر است ممنون از راهنمایی هاتون

dark-man
دوشنبه 29 آبان 1391, 21:36 عصر
در حالت عادی ، ویندوز برای هر یک از پورت های usb یک شناسه خاص مشخص می کنه ، مثلا" com 3 ، شما باید این شناسه رو از طریق property مربوط به مودم در device manager پیدا کنی و بعد براساس اون ، مودم رو فعال کنی یا به قول دوستمون اطلاعات مودم رو به دست بیاری .

BORHAN TEC
دوشنبه 29 آبان 1391, 22:00 عصر
در device manager پیدا کنی و بعد براساس اون
نیازی هم نیست که به صورت دستی از توی Device Manager پیدا کنه. قبلاً توی یکی از برنامه هام یه تابع آماده برای اینکار نوشته بودم که به صورت اتوماتیک پورت مربوطه رو پیدا می کرد. البته برای یک دستگاه دیگه بود ولی میتونه این مشکل رو هم حل کنه. الان باید دنبالش بگردم چون دقیقاً نمیدونم کجاست. انشاالله تا فردا یا نهایتاً تا پس فردا صبح توی همین تاپیک قرارش می دم. جناب hedi اگر یادم رفت لطفاً یک PM بدین و یادآوری کنید.

BORHAN TEC
سه شنبه 07 آذر 1391, 17: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'));

موفق و سربلند باشید...