Jump to content


  • Content Count

  • Joined

  • Last visited

Community Reputation

0 Neutral

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. function CopyFileIFileOperationForceDirectories(const srcFile, destFile : string) : boolean; //works on Windows >= Vista and 2008 server var r : HRESULT; fileOp: IFileOperation; siSrcFile: IShellItem; siDestFolder: IShellItem; destFileFolder, destFileName : string; pbc : IBindCtx; w32fd : TWin32FindData; ifs : TFileSystemBindData; begin result := false; destFileFolder := ExtractFileDir(destFile); destFileName := ExtractFileName(destFile); //init com r := CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE); if Succeeded(r) then begin //create IFileOperation interface r := CoCreateInstance(CLSID_FileOperation, nil, CLSCTX_ALL, IFileOperation, fileOp); if Succeeded(r) then begin //set operations flags r := fileOp.SetOperationFlags(FOF_FILESONLY OR FOF_NORECURSION OR FOF_NOCONFIRMATION OR FOFX_NOMINIMIZEBOX); if Succeeded(r) then begin //get source shell item r := SHCreateItemFromParsingName(PChar(srcFile), nil, IShellItem, siSrcFile); if Succeeded(r) then begin //create binding context to pretend there is a folder there if NOT DirectoryExists(destFileFolder) then begin ZeroMemory(@w32fd, Sizeof(TWin32FindData)); w32fd.dwFileAttributes := FILE_ATTRIBUTE_DIRECTORY; ifs := TFileSystemBindData.Create; ifs.SetFindData(w32fd); r := CreateBindCtx(0, pbc); r := pbc.RegisterObjectParam(STR_FILE_SYS_BIND_DATA, ifs); end else pbc := nil; //get destination folder shell item r := SHCreateItemFromParsingName(PChar(destFileFolder), pbc, IShellItem, siDestFolder); //add copy operation if Succeeded(r) then r := fileOp.CopyItem(siSrcFile, siDestFolder, PChar(destFileName), nil); end; //execute if Succeeded(r) then r := fileOp.PerformOperations; result := Succeeded(r); OleCheck(r); end; end; CoUninitialize; end; end; when i issue the command to copy, it copies all of the subfolders when all i want it the specified folder only. CopyFileIFileOperationForceDirectories('c:\dir1', 'd:\dir1') it shows the copying of c:\dir1 to d:\dir1 but then when that is done it shows to be copying c:\dir1\subdir1 and all of its files. i only wish to copy the directory and none of the subfolders
  2. Is there a way to load up the email and user name fields after it is open or do i need to push it all at once. current opening up a chat with web url using the users default web browser that looks like this http://chat.company.com/WebChat/Main.aspx?QueueName=Que_001 when it opens up the user then enter the email and user name box and clicks on a submit button. the Que_### changes depending on the app the user has open and that part i have but now i am asked to see about autofilling the email/name fields. as for clicking the submit button or not that is for a later phase of project.
  3. RTollison

    Delphi Registry entries default...

    That worked but with a caveat the "option #" registry name cannot have spaces in them. you name them without spaces but in there default you show the name you want to display. abc_auto_file shell (Default) "option_3" option_1 (Default) "Option 1" command option_2 (Default) "Option 2" command option_3 (Default) "Option 3" command Remy, I see your posts all over the place and just wanted to say thanks for all you do.
  4. with my registry edit program in place and working, a user ask if i could set the default one that is not "OPEN" here is the structure of the registry entries abc_auto_file shell option 1 command option 2 command option 3 command Is there a way to have option 3 be the default and not option 1. is there a way to have the option NOT be sorted. like have option 3 as the top one. I have done searches and found default for file type but nothing for my situation. i would like to allow users to decide the order and which one is default to when just double clicking a file type.
  5. I am writing up a program to allow users to update/add to registry entries. the registry is for ABC_Auto_File and has different options not just open... I have it up and working but am curious of a better way to parse the info in the registry string. examples of the string in question are: "c:\my folder\myapp.exe" -c "c:\my folder2\myconfigfile" "%1" c:\folder\myapp -c c:\folder2\myconfigfile %1 c:\folder\myapp %1 the -C is there 99.99% of the time but sometimes users have it working without it. but i will be add it in when updating the registry. like wipe and rewrite. myapp is consistent but may include the .exe. current i am removing all the " and %1 the look for the -c anything prior is a string value i want and anything to the right is a sting value i want. i am currently using the copy/pos commands to get that info but am ALWAYS curious if someone has better option for parsing.
  6. i have a function that i am unable to solve. Tried array of ansichar but still no luck and i am at a loss on how to resolve. If I need to rewrite it then so be it but i cant find any examples of delphi and devicecapabiliesA. getting errors on the DeviceCapabilitesA function. [dcc32 Error] uiDevMode.pas(64): E2010 Incompatible types: 'PAnsiChar' and 'array[0..255] of Char' [dcc32 Error] uiDevMode.pas(72): E2010 Incompatible types: 'PAnsiChar' and 'array[0..255] of Char' function PrinterFormExists(FormName: string): boolean; var Device: array [0..255] of char; Driver: array [0..255] of char; Port: array [0..255] of char; DeviceHandle: THandle; PaperNames: Pointer; i: integer; PaperTypes: TStrings; PaperCount: integer; begin {$R-}// Range checking off. Result := False; PaperTypes := TStringList.Create; try // First get the number of paper names available. Printer.PrinterIndex := Printer.PrinterIndex; Printer.GetPrinter(Device, Driver, Port, DeviceHandle); PaperCount := DeviceCapabilitiesA((Device), Port, DC_PAPERNAMES, nil, nil); if PaperCount > 0 then begin { Now allocate the array of paper names. Each paper name is 64 bytes. Therefore, allocate PaperCount*64 of memory. } GetMem(PaperNames, PaperCount * 64); try // Retrieve the list of names into the allocated memory block. if DeviceCapabilitiesA((Device), Port, DC_PAPERNAMES, PaperNames, nil) = -1 then raise Exception.Create('DevCap Error'); // Add the paper names to the appropriate list box. for i := 0 to PaperCount - 1 do PaperTypes.Add(Uppercase(Trim(StrPas(TPNames(PaperNames^))))); finally FreeMem(PaperNames, PaperCount * 64); end; if PaperTypes.IndexOf(UpperCase(FormName)) > -1 then Result := True; end finally PaperTypes.Free; end; {$R+}// Range checking back on. end;
  7. RTollison

    Need to convert varbinary to hex string in a dll

    by the way thanks this has solved my problem and i am continuing on with my dll. i used the mybintohex solution.
  8. RTollison

    Need to convert varbinary to hex string in a dll

    this is from another partys file. (micro focus acucobol) they have a lock file that will let me know what record id is in use already. via a sample program that is using said lock table as a vision file (non sql which we do not do because we wanted all tables to sql if possible) they have an example program that uses this to convert the data to hex format for display purposes. if i could get the raw varbinary data thru the dll i am writing then i could do the same thing. perform varying idx from 1 by 2 until idx > 244 call "ascii2hex" using lockfile-keyvalue(idx:2), list_keyval(2 * idx - 1:4) end-perform the library routine ascii2hex ASCII2HEX converts binary data to its hexadecimal format. This routine is the inverse of the HEX2ASCII routine. Usage CALL "" USING ASCII-VALUE, HEX-VALUE Parameters ASCII-VALUE PIC X(2) The input data area containing the ASCII representation of a unit of data. HEX-VALUE PIC X(4) The output data area to contain the hexadecimal value. When you define the parameters, use the exact field sizes specified in the calling conventions above, otherwise the runtime may terminate abnormally.
  9. RTollison

    Need to convert varbinary to hex string in a dll

    this is what i did to get the odd ball 2nd row but i am concerned that i might be overlooking something that could cause it to not be correct... function bintoAscii(const bin: array of byte): AnsiString; var i: integer; begin SetLength(Result, Length(bin)); for i := 0 to Length(bin)-1 do Result[1+i] := AnsiChar(bin); end; function bintostr(const bin: array of byte): string; const HexSymbols = '0123456789ABCDEF'; var i: integer; begin SetLength(Result, 2*Length(bin)); for i := 0 to Length(bin)-1 do begin Result[1 + 2*i + 0] := HexSymbols[1 + bin shr 4]; Result[1 + 2*i + 1] := HexSymbols[1 + bin and $0F]; end; end; ..... _KeyValue := bintoAscii(dmspCreate.adsAcuLocks1.FieldbyName('KeyValue').AsBytes); if (_keyValue[1] = #0) then _keyValue := bintoStr(dmspCreate.adsAcuLocks1.FieldbyName('KeyValue').AsBytes);
  10. RTollison

    Need to convert varbinary to hex string in a dll

    the sql column has this info 0x303031323030363130300000000000 0x000000036100000000000000000000 0x303031323030363130303031000000 by using the bintohex it works on the first and third row but the 2nd row is coming back blank. the info after 0x is exactly what i want to get back in my cobol program. as long as it looks like the string shown.
  11. RTollison

    Need to convert varbinary to hex string in a dll

    My dll is being called by a cobol program(acucobol) if i try to pass back the binary (stdcall) it thinks i am null terminated for 0x0000000361000000000000 the 00 comes back null and my string is blank in my cobol program
  12. i am writing a dll the returns a pansichar value but on the sql table it is a varbinary of the hex value 0x3030313230303631303000 i need to return that thru the dll as a hex string of 3030313230303631303000 then in my calling program i can convert it from hex to ascii string if it is possible to convert it to ascii string in the dll that is fine but i am not sure how to convert it in the dll from varbinary to anything usable at this point.
  13. Never mind found a solution. use the view as text and saw the fields defined in there and removed them all and now it compiles and runs correctly.
  14. I have an ADOQuery that gets changed based upon user selection. when it changes to a distinct option i get an error saying adoquery.field.app not found. But if i take the command text and paste it into sql query and run it i get the results that i need. In my form, comparing to a very old version of the form i see these lines added ADOQuery1id: TStringField; ADOQuery1app: TStringField; ADOQuery1version: TStringField; ADOQuery1Patch_Version: TStringField; ADOQuery1Patch_Level: TStringField; when i remove those lines from the form and try to compile i get an error 'Class TStringfield not found' but in my uses i have the Data.DB added. The query is tied to a datasource that is tied to a smdbgrid. I know the query is correct, but i suspect that since those fields were added to the form it is wanting to reference them or something.